﻿Imports Oracle.DataAccess.Client
Imports System.Data.OleDb
Imports System.IO
Public Class cBodegas

    'Private lDtBodegas As AdminVentasDataSet.tbBodegasDataTable
    Private lDrBodegas As lbGlobalcom.dsInventarios.INV_BODEGASRow

    Sub New(ByVal idBodega As String)
        Try
            Dim daBode As New lbGlobalcom.dsInventariosTableAdapters.INV_BODEGASTableAdapter
            Dim dtBode As lbGlobalcom.dsInventarios.INV_BODEGASDataTable = daBode.GetDataByIdBodega(idBodega)
            If dtBode.Rows.Count > 0 Then
                lDrBodegas = dtBode.Rows(0)
            Else
                Throw New Exception("Bodega no existe favor verifique e intente de nuevo")
            End If
        Catch ex As Exception
            cError.SalvaError(ex, "Samuel")
            Throw ex
        End Try

    End Sub

    Public Property idBodega() As String
        Get
            Return lDrBodegas.IDBODEGA
        End Get
        Set(ByVal value As String)
            lDrBodegas.IDBODEGA = value
        End Set
    End Property

    Public Property Descripcion() As String
        Get
            Return lDrBodegas.DESCRIPCION
        End Get
        Set(ByVal value As String)
            lDrBodegas.DESCRIPCION = value
        End Set
    End Property

    Public Property activa() As Boolean
        Get
            Return lDrBodegas.ACTIVA
        End Get
        Set(ByVal value As Boolean)
            lDrBodegas.ACTIVA = value
        End Set
    End Property

    Public Property ExistenciaCliente() As String
        Get
            Return lDrBodegas.EXISTENCIACLIENTE
        End Get
        Set(ByVal value As String)
            lDrBodegas.EXISTENCIACLIENTE = value
        End Set
    End Property

    Public Property idSede() As String
        Get
            Return lDrBodegas.IDSEDE
        End Get
        Set(ByVal value As String)
            lDrBodegas.IDSEDE = value
        End Set
    End Property

    Protected Overrides Sub Finalize()
        lDrBodegas = Nothing
    End Sub
End Class

Public Class cAfectaIventarios
    Private iBodegaOri As cBodegas
    Private iBodegaDes As cBodegas
    Private iTipoDoc As cTipoDocumento
    Private iPeriodo As cPeriodos
    Private iClientes As cClientes

    Private lDsMov As dsMovimiento
    'Private lDrEncMov As lbGlobalcom.dsMovimiento.MOV_MOVIMIENTORow
    Private lDrDescDet As lbGlobalcom.dsMovimiento.MOV_DESCRIPCIONDETRow
    Private lTipoDoc As String
    Private lNumeroDoc As Integer
    Private lBodegaDe As String
    Private lBodegaPara As String
    Private lTercero As String
    Private lDesdeRecons As Boolean = False
    Private lDocCerrado As String
    Private Sub Totaliza()
        Dim Totalfac As Double = 0
        Dim VrBase As Double = 0
        Dim vrIva As Double = 0
        Dim TotalAbonos As Decimal = 0
        For Each drDet As dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsMov.MOV_MOVIMIENTODETALLE.Rows
            If drDet.RowState <> DataRowState.Deleted Then
                Totalfac += (drDet.VALORBASE + drDet.VALORIVA) * (1 + drDet.DESCUENTO1) * (1 + drDet.DESCUENTO2) * drDet.CANTIDAD
                VrBase += drDet.VALORBASE * (1 + drDet.DESCUENTO1) * (1 + drDet.DESCUENTO2) * drDet.CANTIDAD
                vrIva += drDet.VALORIVA * (1 + drDet.DESCUENTO1) * (1 + drDet.DESCUENTO2) * drDet.CANTIDAD
            End If
        Next

        If lDsMov.MOV_MOVIMIENTO.Rows.Count > 0 Then
            Dim drEnc As dsMovimiento.MOV_MOVIMIENTORow = lDsMov.MOV_MOVIMIENTO.Rows(0)
            If lDocCerrado = "S" And drEnc.RowState <> DataRowState.Deleted Then
                TotalAbonos = cGeneral.GetTotalAbonos(drEnc.IDDOCUMENTO, drEnc.NUMERO)
            End If
            If drEnc.RowState <> DataRowState.Deleted Then
                drEnc.SALDO = Totalfac - TotalAbonos
                drEnc.VALORBASE = VrBase
                drEnc.VALORIVA = vrIva
            End If
        End If
    End Sub
    Public Sub New(ByVal dsMovimi As lbGlobalcom.dsMovimiento, ByVal TipoDoc As cTipoDocumento, ByVal Per As cPeriodos, ByVal DesdeRecons As Boolean, ByVal docCerrado As String)
        lDesdeRecons = DesdeRecons
        lDsMov = dsMovimi
        iPeriodo = Per
        iTipoDoc = TipoDoc
        lDocCerrado = docCerrado
        Totaliza()
    End Sub
    Public Sub New(ByVal dsMovimi As lbGlobalcom.dsMovimiento, ByVal TipoDoc As cTipoDocumento, ByVal Per As cPeriodos, ByVal DesdeRecons As Boolean, ByVal Cliente As cClientes, ByVal docCerrado As String)
        Me.New(dsMovimi, TipoDoc, Per, DesdeRecons, docCerrado)
        If Cliente IsNot Nothing Then
            iClientes = Cliente
        End If
    End Sub
    Private Sub CambiaEstadoPPack(ByVal TipoSubproP As Integer, ByVal NumeroRegistroP As String, ByVal Estado As String)
        Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = conn.CreateCommand
                cmd.CommandText = "INV_CAMBIAESTADOPPACK"
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.Add("PTIPOSUBPROP", OracleDbType.Int32).Value = TipoSubproP
                cmd.Parameters.Add("PNUMEROREGISTROP", OracleDbType.Varchar2).Value = NumeroRegistroP
                cmd.Parameters.Add("PESTADO", OracleDbType.Varchar2).Value = Estado
                Try
                    conn.Open()
                    cmd.ExecuteNonQuery()
                    conn.Close()
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub
    Private Sub InsertDescDetalle(ByVal IdBodega As String, ByVal Costo As Double, ByVal Fecha As DateTime, ByVal drDet As dsMovimiento.MOV_DESCRIPCIONDETRow, ByVal Version As DataRowVersion)
        Using Conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmdIns As OracleCommand = Conn.CreateCommand
                Try
                    Conn.Open()
                    cmdIns.CommandType = CommandType.StoredProcedure
                    cmdIns.CommandText = "INV_ACTUALIZADETINSERT"
                    cmdIns.Parameters.Add("PIDBODEGA", OracleDbType.Varchar2).Value = IdBodega
                    If iTipoDoc.DocEs = eTipoMovimi.TrasladoCodigo AndAlso drDet.RowState <> DataRowState.Deleted Then
                        Dim iProd As New cProducto(drDet("IDPRODUCTO", Version))
                        cmdIns.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2).Value = iProd.IdProdConvierte
                    Else
                        cmdIns.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2).Value = drDet("IDPRODUCTO", Version)
                    End If
                    cmdIns.Parameters.Add("PCONSECUTIVO", OracleDbType.Int32).Value = drDet("NUMEROPRODUCTO", Version)
                    cmdIns.Parameters.Add("PTIPOSUBPROD", OracleDbType.Int16).Value = drDet("TIPOSUBPROD", Version)
                    cmdIns.Parameters.Add("PNUMEROREGISTRO", OracleDbType.Varchar2).Value = drDet("NUMEROREGISTRO", Version)
                    cmdIns.Parameters.Add("PCOSTO", OracleDbType.Varchar2).Value = Costo
                    cmdIns.Parameters.Add("PFECHA", OracleDbType.Date).Value = Fecha
                    cmdIns.Parameters.Add("PPAREJA", OracleDbType.Varchar2).Value = drDet("IDDOCUMENTO", Version) & drDet("NUMERO", Version)
                    cmdIns.ExecuteNonQuery()
                    Conn.Close()
                Catch ex As Exception
                    Throw ex
                    cError.SalvaError(ex, "Samuel")
                End Try

            End Using
        End Using
    End Sub

    Private Sub DeleteDescDetalle(ByVal TIPOSUBPROD As Int16, ByVal NUMEROREGISTRO As String)
        Using Conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmdDel As OracleCommand = Conn.CreateCommand
                Try
                    Conn.Open()
                    cmdDel.CommandType = CommandType.StoredProcedure
                    cmdDel.CommandText = "INV_ACTUALIZADETDELETE"
                    cmdDel.Parameters.Add("PTIPOSUBPROD", OracleDbType.Int16).Value = TIPOSUBPROD
                    cmdDel.Parameters.Add("PNUMEROREGISTRO", OracleDbType.Varchar2).Value = NUMEROREGISTRO
                    cmdDel.ExecuteNonQuery()
                    Conn.Close()
                Catch ex As Exception
                    Throw ex
                    cError.SalvaError(ex, "Samuel")
                End Try
            End Using
        End Using
    End Sub
    Private Function getCosto(ByVal drDetMov As dsMovimiento.MOV_MOVIMIENTODETALLERow) As Double
        Dim Costo As Double = 0
        Select Case drDetMov.RowState
            Case DataRowState.Deleted
                Costo = drDetMov("VALORBASE", DataRowVersion.Original) * (1 - drDetMov("DESCUENTO1", DataRowVersion.Original)) * (1 - drDetMov("DESCUENTO2", DataRowVersion.Original))
            Case DataRowState.Modified, DataRowState.Unchanged
                Costo = drDetMov("VALORBASE", DataRowVersion.Current) * (1 - drDetMov("DESCUENTO1", DataRowVersion.Current)) * (1 - drDetMov("DESCUENTO2", DataRowVersion.Current))
            Case Else
                Costo = drDetMov.VALORBASE * (1 - drDetMov.DESCUENTO1) * (1 - drDetMov.DESCUENTO2)
        End Select
        Return Costo
    End Function
    Private Function GetBodega(ByVal drMov As dsMovimiento.MOV_MOVIMIENTORow, ByVal Cual As String) As String
        If Cual = "Ori" Then
            Select Case drMov.RowState
                Case DataRowState.Deleted
                    Return drMov("IDBODEGAORIGEN", DataRowVersion.Original)
                Case DataRowState.Modified, DataRowState.Unchanged
                    Return drMov("IDBODEGAORIGEN", DataRowVersion.Current)
                Case Else
                    Return drMov.IDBODEGAORIGEN
            End Select
        Else
            Select Case drMov.RowState
                Case DataRowState.Deleted
                    Return drMov("IDBODEGADESTINO", DataRowVersion.Original)
                Case DataRowState.Modified, DataRowState.Unchanged
                    Return drMov("IDBODEGADESTINO", DataRowVersion.Current)
                Case Else
                    Return drMov.IDBODEGADESTINO
            End Select
        End If
    End Function
    Private Function GetFechaDoc(ByVal drMov As dsMovimiento.MOV_MOVIMIENTORow) As DateTime
        Select Case drMov.RowState
            Case DataRowState.Deleted
                Return drMov("FECHADOCUMENTO", DataRowVersion.Original)
            Case DataRowState.Modified, DataRowState.Unchanged
                Return drMov("FECHADOCUMENTO", DataRowVersion.Current)
            Case Else
                Return drMov.FECHADOCUMENTO
        End Select
    End Function
    Private Function GetIDDoc(ByVal drDet As DataRow) As String
        Select Case drDet.RowState
            Case DataRowState.Deleted
                Return drDet("IDDOCUMENTO", DataRowVersion.Original)
            Case DataRowState.Modified, DataRowState.Unchanged
                Return drDet("IDDOCUMENTO", DataRowVersion.Current)
            Case Else
                Return drDet("IDDOCUMENTO")
        End Select
    End Function

    Private Function GetNumeroDoc(ByVal drDet As DataRow) As Int32
        Select Case drDet.RowState
            Case DataRowState.Deleted
                Return drDet("NUMERO", DataRowVersion.Original)
            Case DataRowState.Modified, DataRowState.Unchanged
                Return drDet("NUMERO", DataRowVersion.Current)
            Case Else
                Return drDet("NUMERO")
        End Select
    End Function
    Private Function GetNumeroLinea(ByVal drDet As DataRow) As Int32
        Select Case drDet.RowState
            Case DataRowState.Deleted
                Return drDet("NUMEROLINEA", DataRowVersion.Original)
            Case DataRowState.Modified, DataRowState.Unchanged
                Return drDet("NUMEROLINEA", DataRowVersion.Current)
            Case Else
                Return drDet("NUMEROLINEA")
        End Select
    End Function
    Private Function GetIdProducto(ByVal drDet As DataRow) As String
        Select Case drDet.RowState
            Case DataRowState.Deleted
                Return drDet("IDPRODUCTO", DataRowVersion.Original)
            Case DataRowState.Modified, DataRowState.Unchanged
                Return drDet("IDPRODUCTO", DataRowVersion.Current)
            Case Else
                Return drDet("IDPRODUCTO")
        End Select
    End Function
    Private Function GetChildRows(ByVal drDet As dsMovimiento.MOV_MOVIMIENTODETALLERow) As DataRow()
        Select Case drDet.RowState
            Case DataRowState.Deleted
                Return drDet.GetChildRows("FK_MOV_MOVIMIENTODETALLE_MOV_DESCRIPCIONDET", DataRowVersion.Original)
            Case Else
                Return drDet.GetChildRows("FK_MOV_MOVIMIENTODETALLE_MOV_DESCRIPCIONDET")
        End Select
    End Function
    Private Sub AfectaDetalleInvenarios(ByVal drMov As dsMovimiento.MOV_MOVIMIENTORow, ByVal drDetMov As dsMovimiento.MOV_MOVIMIENTODETALLERow)
        If lDsMov.MOV_DESCRIPCIONDET.GetChanges IsNot Nothing Then
            Select Case iTipoDoc.DocEs
                Case eTipoMovimi.Compra, eTipoMovimi.Entrada, eTipoMovimi.NCVentas
                    Dim TipoBod As String = "Des"
                    For Each drDescDet As dsMovimiento.MOV_DESCRIPCIONDETRow In lDsMov.MOV_DESCRIPCIONDET.GetChanges.Rows
                        If GetIDDoc(drDescDet) = GetIDDoc(drDetMov) And GetNumeroDoc(drDescDet) = GetNumeroDoc(drDetMov) And GetNumeroLinea(drDescDet) = GetNumeroLinea(drDetMov) Then
                            Select Case drDescDet.RowState
                                Case DataRowState.Added
                                    InsertDescDetalle(GetBodega(drMov, TipoBod), getCosto(drDetMov), GetFechaDoc(drMov), drDescDet, DataRowVersion.Current)
                                    If iTipoDoc.DocEs = eTipoMovimi.NCVentas Then _
                                        CambiaEstadoPPack(drDescDet("TIPOSUBPROD", DataRowVersion.Current), drDescDet("NUMEROREGISTRO", DataRowVersion.Current), "S")
                                Case DataRowState.Modified
                                    DeleteDescDetalle(drDescDet("TIPOSUBPROD", DataRowVersion.Original), drDescDet("NUMEROREGISTRO", DataRowVersion.Original))
                                    InsertDescDetalle(GetBodega(drMov, TipoBod), getCosto(drDetMov), GetFechaDoc(drMov), drDescDet, DataRowVersion.Current)
                                Case DataRowState.Deleted
                                    DeleteDescDetalle(drDescDet("TIPOSUBPROD", DataRowVersion.Original), drDescDet("NUMEROREGISTRO", DataRowVersion.Original))
                                    If iTipoDoc.DocEs = eTipoMovimi.NCVentas Then _
                                        CambiaEstadoPPack(drDescDet("TIPOSUBPROD", DataRowVersion.Original), drDescDet("NUMEROREGISTRO", DataRowVersion.Original), "N")
                            End Select
                        End If
                    Next
                Case eTipoMovimi.Venta, eTipoMovimi.Salida, eTipoMovimi.NDCompras
                    For Each drDescDet As dsMovimiento.MOV_DESCRIPCIONDETRow In lDsMov.MOV_DESCRIPCIONDET.GetChanges.Rows
                        If GetIDDoc(drDescDet) = GetIDDoc(drDetMov) And GetNumeroDoc(drDescDet) = GetNumeroDoc(drDetMov) And GetNumeroLinea(drDescDet) = GetNumeroLinea(drDetMov) Then
                            Select Case drDescDet.RowState
                                Case DataRowState.Added
                                    DeleteDescDetalle(drDescDet("TIPOSUBPROD", DataRowVersion.Current), drDescDet("NUMEROREGISTRO", DataRowVersion.Current))
                                    CambiaEstadoPPack(drDescDet("TIPOSUBPROD", DataRowVersion.Current), drDescDet("NUMEROREGISTRO", DataRowVersion.Current), "N")
                                Case DataRowState.Modified
                                    DeleteDescDetalle(drDescDet("TIPOSUBPROD", DataRowVersion.Original), drDescDet("NUMEROREGISTRO", DataRowVersion.Original))
                                    CambiaEstadoPPack(drDescDet("TIPOSUBPROD", DataRowVersion.Original), drDescDet("NUMEROREGISTRO", DataRowVersion.Original), "N")
                                    InsertDescDetalle(GetBodega(drMov, "Ori"), getCosto(drDetMov), GetFechaDoc(drMov), drDescDet, DataRowVersion.Current)
                                    CambiaEstadoPPack(drDescDet("TIPOSUBPROD", DataRowVersion.Current), drDescDet("NUMEROREGISTRO", DataRowVersion.Current), "S")
                                Case DataRowState.Deleted
                                    InsertDescDetalle(GetBodega(drMov, "Ori"), getCosto(drDetMov), GetFechaDoc(drMov), drDescDet, DataRowVersion.Original)
                                    CambiaEstadoPPack(drDescDet("TIPOSUBPROD", DataRowVersion.Original), drDescDet("NUMEROREGISTRO", DataRowVersion.Original), "S")
                            End Select
                        End If
                    Next
                Case eTipoMovimi.Traslado, eTipoMovimi.Resmision, eTipoMovimi.TrasladoCodigo
                    For Each drDescDet As dsMovimiento.MOV_DESCRIPCIONDETRow In lDsMov.MOV_DESCRIPCIONDET.GetChanges.Rows
                        If GetIDDoc(drDescDet) = GetIDDoc(drDetMov) And GetNumeroDoc(drDescDet) = GetNumeroDoc(drDetMov) And GetNumeroLinea(drDescDet) = GetNumeroLinea(drDetMov) Then
                            Select Case drDescDet.RowState
                                Case DataRowState.Added
                                    DeleteDescDetalle(drDescDet("TIPOSUBPROD", DataRowVersion.Current), drDescDet("NUMEROREGISTRO", DataRowVersion.Current))
                                    InsertDescDetalle(GetBodega(drMov, "Des"), getCosto(drDetMov), GetFechaDoc(drMov), drDescDet, DataRowVersion.Current)
                                Case DataRowState.Modified
                                    DeleteDescDetalle(drDescDet("TIPOSUBPROD", DataRowVersion.Original), drDescDet("NUMEROREGISTRO", DataRowVersion.Original))
                                    InsertDescDetalle(GetBodega(drMov, "Des"), getCosto(drDetMov), GetFechaDoc(drMov), drDescDet, DataRowVersion.Current)
                                    DeleteDescDetalle(drDescDet("TIPOSUBPROD", DataRowVersion.Original), drDescDet("NUMEROREGISTRO", DataRowVersion.Original))
                                    InsertDescDetalle(GetBodega(drMov, "Des"), getCosto(drDetMov), GetFechaDoc(drMov), drDescDet, DataRowVersion.Current)
                                Case DataRowState.Deleted
                                    DeleteDescDetalle(drDescDet("TIPOSUBPROD", DataRowVersion.Original), drDescDet("NUMEROREGISTRO", DataRowVersion.Original))
                                    InsertDescDetalle(GetBodega(drMov, "Ori"), getCosto(drDetMov), GetFechaDoc(drMov), drDescDet, DataRowVersion.Original)
                            End Select
                        End If
                    Next
            End Select
        End If
    End Sub

    Private Function ValorCantidad(ByVal Cant As Integer, ByVal TipoDoc As eTipoMovimi) As Integer
        If TipoDoc = eTipoMovimi.NCVentas Or TipoDoc = eTipoMovimi.NDCompras Then
            Return Cant * -1
        Else
            Return Cant
        End If
    End Function
    Public Sub AfectaInventarios()
        Using Conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = Conn.CreateCommand
                cmd.CommandType = CommandType.StoredProcedure
                Conn.Open()
                For Each lDrEncMov As dsMovimiento.MOV_MOVIMIENTORow In lDsMov.MOV_MOVIMIENTO.Rows
                    If lDsMov.MOV_MOVIMIENTO.Rows.Count > 0 And lDsMov.MOV_MOVIMIENTODETALLE.Rows.Count > 0 Then
                        Select Case iTipoDoc.DocEs
                            Case eTipoMovimi.Compra, eTipoMovimi.NDCompras
                                cmd.CommandText = "INV_ACTUALIZAIVENTARIOSCOMPRAS"
                                Dim BodegaPara As String
                                Dim TipoDoc As String
                                Dim NumeroDoc As Integer
                                Select Case lDrEncMov.RowState
                                    Case DataRowState.Deleted
                                        BodegaPara = lDrEncMov("IDBODEGADESTINO", DataRowVersion.Original)
                                        TipoDoc = lDrEncMov("IDDOCUMENTO", DataRowVersion.Original)
                                        If iTipoDoc.DocEs = eTipoMovimi.Compra Then
                                            NumeroDoc = lDrEncMov("NUMERO", DataRowVersion.Original)
                                        Else
                                            NumeroDoc = lDrEncMov("NUMERO", DataRowVersion.Original)
                                        End If
                                    Case Else
                                        'BodegaPara = lDrEncMov("IDBODEGAORIGEN")
                                        TipoDoc = lDrEncMov("IDDOCUMENTO")
                                        If iTipoDoc.DocEs = eTipoMovimi.Compra Then
                                            BodegaPara = lDrEncMov("IDBODEGADESTINO")
                                            TipoDoc = lDrEncMov("IDDOCUMENTO")
                                            NumeroDoc = lDrEncMov("NUMERO")
                                        Else
                                            BodegaPara = lDrEncMov("IDBODEGAORIGEN")
                                            TipoDoc = lDrEncMov("IDDOCUMENTO")
                                            NumeroDoc = lDrEncMov("NUMERO")
                                        End If
                                End Select
                                cmd.Parameters.Add("PBODEGAPARA", OracleDbType.Varchar2).Value = BodegaPara
                                cmd.Parameters.Add("PPERIODO", OracleDbType.Varchar2).Value = iPeriodo.IDPERIODO
                                cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2)
                                cmd.Parameters.Add("PCANTIDAD", OracleDbType.Int32)
                                cmd.Parameters.Add("PVALOR", OracleDbType.Double)
                                cmd.Parameters.Add("PIDDOCUMENTO", OracleDbType.Varchar2).Value = TipoDoc
                                cmd.Parameters.Add("PNUMERO", OracleDbType.Int32).Value = NumeroDoc
                                cmd.Parameters.Add("PLINEA", OracleDbType.Int32)
                                For Each lDrDetMov As lbGlobalcom.dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsMov.MOV_MOVIMIENTODETALLE.Rows
                                    AfectaDetalleInvenarios(lDrEncMov, lDrDetMov)
                                    Select Case lDrDetMov.RowState
                                        Case DataRowState.Added
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO").ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = ValorCantidad(lDrDetMov("CANTIDAD"), iTipoDoc.DocEs)
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE")
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA")
                                            cmd.ExecuteNonQuery()
                                        Case DataRowState.Modified
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = ValorCantidad(lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1, iTipoDoc.DocEs)
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                            cmd.ExecuteNonQuery()
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Current).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = ValorCantidad(lDrDetMov("CANTIDAD", DataRowVersion.Current), iTipoDoc.DocEs)
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Current)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Current)
                                            cmd.ExecuteNonQuery()
                                        Case DataRowState.Deleted
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = ValorCantidad(lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1, iTipoDoc.DocEs)
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                            cmd.ExecuteNonQuery()
                                    End Select
                                Next
                            Case eTipoMovimi.Venta, eTipoMovimi.NCVentas
                                cmd.CommandText = "INV_ACTUALIZAINVENTARIOSVENTAS"
                                Dim Bodega As String
                                Dim CCliente As String
                                Dim ExistenciaCliente As String = ""
                                Dim TipoDoc As String
                                Dim NumeroDoc As Integer
                                Select Case lDrEncMov.RowState
                                    Case DataRowState.Deleted
                                        TipoDoc = lDrEncMov("IDDOCUMENTO", DataRowVersion.Original)
                                        NumeroDoc = lDrEncMov("NUMERO", DataRowVersion.Original)
                                        If iTipoDoc.DocEs = eTipoMovimi.Venta Then
                                            Bodega = lDrEncMov("IDBODEGAORIGEN", DataRowVersion.Original)
                                            iBodegaOri = New cBodegas(Bodega)
                                        Else
                                            Bodega = lDrEncMov("IDBODEGADESTINO", DataRowVersion.Original)
                                            iBodegaDes = New cBodegas(Bodega)
                                        End If
                                        CCliente = lDrEncMov("IDTERCERO", DataRowVersion.Original)
                                    Case Else
                                        TipoDoc = lDrEncMov("IDDOCUMENTO")
                                        NumeroDoc = lDrEncMov("NUMERO")
                                        If iTipoDoc.DocEs = eTipoMovimi.Venta Then
                                            Bodega = lDrEncMov("IDBODEGAORIGEN")
                                            iBodegaOri = New cBodegas(Bodega)
                                            ExistenciaCliente = iBodegaOri.ExistenciaCliente
                                        Else
                                            Bodega = lDrEncMov("IDBODEGADESTINO")
                                            iBodegaDes = New cBodegas(Bodega)
                                            ExistenciaCliente = iBodegaDes.ExistenciaCliente
                                        End If
                                        CCliente = lDrEncMov("IDTERCERO")

                                End Select
                                cmd.Parameters.Add("PBODEGAORIGEN", OracleDbType.Varchar2).Value = Bodega
                                'If iTipoDoc.DocEs = eTipoMovimi.Venta Then

                                'Else
                                '    cmd.Parameters.Add("IDBODEGADESTINO", OracleDbType.Varchar2).Value = Bodega
                                'End If
                                cmd.Parameters.Add("PPERIODO", OracleDbType.Varchar2).Value = iPeriodo.IDPERIODO
                                If iClientes.BodegaConsignacion = Bodega AndAlso ExistenciaCliente = "S" Then
                                    cmd.Parameters.Add("PCLIENTE", OracleDbType.Varchar2).Value = CCliente
                                Else
                                    cmd.Parameters.Add("PCLIENTE", OracleDbType.Varchar2).Value = 0
                                End If
                                cmd.Parameters.Add("PEXISTENCIANEGATIVA", OracleDbType.Char).Value = IIf(lDesdeRecons, "S", iTipoDoc.existenciasNegativas)
                                cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2)
                                cmd.Parameters.Add("PCANTIDAD", OracleDbType.Int32)
                                cmd.Parameters.Add("PVALOR", OracleDbType.Double)
                                cmd.Parameters.Add("PIDDOCUMENTO", OracleDbType.Varchar2).Value = TipoDoc
                                cmd.Parameters.Add("PNUMERO", OracleDbType.Int32).Value = NumeroDoc
                                cmd.Parameters.Add("PLINEA", OracleDbType.Int32)
                                Dim PCantFinal As OracleParameter = cmd.Parameters.Add("PCANTIDADFINAL", OracleDbType.Int32)
                                PCantFinal.Direction = ParameterDirection.Output
                                For Each lDrDetMov As lbGlobalcom.dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsMov.MOV_MOVIMIENTODETALLE.Rows
                                    AfectaDetalleInvenarios(lDrEncMov, lDrDetMov)
                                    Select Case lDrDetMov.RowState
                                        Case DataRowState.Added
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO").ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = ValorCantidad(lDrDetMov("CANTIDAD"), iTipoDoc.DocEs)
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE")
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA")
                                            cmd.ExecuteNonQuery()
                                            If lDesdeRecons = False AndAlso iTipoDoc.existenciasNegativas = "N" And iTipoDoc.DocEs = eTipoMovimi.Venta Then
                                                lDrDetMov.BeginEdit()
                                                lDrDetMov.CANTIDAD = CInt(PCantFinal.Value.ToString)
                                                lDrDetMov.EndEdit()
                                            End If
                                        Case DataRowState.Modified
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = ValorCantidad(lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1, iTipoDoc.DocEs)
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                            cmd.ExecuteNonQuery()
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Current).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = ValorCantidad(lDrDetMov("CANTIDAD", DataRowVersion.Current), iTipoDoc.DocEs)
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Current)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Current)
                                            cmd.ExecuteNonQuery()
                                            If lDesdeRecons = False AndAlso iTipoDoc.existenciasNegativas = "N" And iTipoDoc.DocEs = eTipoMovimi.Venta Then
                                                lDrDetMov.BeginEdit()
                                                lDrDetMov.CANTIDAD = CInt(PCantFinal.Value.ToString)
                                                lDrDetMov.EndEdit()
                                            End If
                                        Case DataRowState.Deleted
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = ValorCantidad(lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1, iTipoDoc.DocEs)
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                            cmd.ExecuteNonQuery()
                                    End Select
                                Next
                            Case eTipoMovimi.Entrada
                                cmd.CommandText = "INV_ACTUALIZAINEVENTARIOENT"
                                Dim BodegaPara As String
                                Dim TipoDoc As String
                                Dim NumeroDoc As Integer
                                Select Case lDrEncMov.RowState
                                    Case DataRowState.Deleted
                                        BodegaPara = lDrEncMov("IDBODEGADESTINO", DataRowVersion.Original)
                                        TipoDoc = lDrEncMov("IDDOCUMENTO", DataRowVersion.Original)
                                        NumeroDoc = lDrEncMov("NUMERO", DataRowVersion.Original)
                                    Case Else
                                        BodegaPara = lDrEncMov("IDBODEGADESTINO")
                                        TipoDoc = lDrEncMov("IDDOCUMENTO")
                                        NumeroDoc = lDrEncMov("NUMERO")
                                End Select
                                cmd.Parameters.Add("PBODEGAPARA", OracleDbType.Varchar2).Value = BodegaPara
                                cmd.Parameters.Add("PPERIODO", OracleDbType.Varchar2).Value = iPeriodo.IDPERIODO
                                cmd.Parameters.Add("PIDCLIENTE", OracleDbType.Varchar2).Value = 0
                                cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2)
                                cmd.Parameters.Add("PCANTIDAD", OracleDbType.Int32)
                                cmd.Parameters.Add("PVALOR", OracleDbType.Double)
                                cmd.Parameters.Add("PIDDOCUMENTO", OracleDbType.Varchar2).Value = TipoDoc
                                cmd.Parameters.Add("PNUMERO", OracleDbType.Int32).Value = NumeroDoc
                                cmd.Parameters.Add("PLINEA", OracleDbType.Int32)
                                cmd.Parameters.Add("PBODEGAORI", OracleDbType.Varchar2).Value = DBNull.Value
                                For Each lDrDetMov As lbGlobalcom.dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsMov.MOV_MOVIMIENTODETALLE.Rows
                                    AfectaDetalleInvenarios(lDrEncMov, lDrDetMov)
                                    Select Case lDrDetMov.RowState
                                        Case DataRowState.Added
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO").ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD")
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE")
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA")
                                            cmd.ExecuteNonQuery()
                                        Case DataRowState.Modified
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                            cmd.ExecuteNonQuery()
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Current).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Current)
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Current)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Current)
                                            cmd.ExecuteNonQuery()
                                        Case DataRowState.Deleted
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                            cmd.ExecuteNonQuery()
                                    End Select
                                Next
                            Case eTipoMovimi.Salida
                                cmd.CommandText = "INV_ACTUALIZAINVENTARIOSSAL"
                                Dim BodegaOri As String
                                Dim TipoDoc As String
                                Dim NumeroDoc As Integer
                                Select Case lDrEncMov.RowState
                                    Case DataRowState.Deleted
                                        BodegaOri = lDrEncMov("IDBODEGAORIGEN", DataRowVersion.Original)
                                        TipoDoc = lDrEncMov("IDDOCUMENTO", DataRowVersion.Original)
                                        NumeroDoc = lDrEncMov("NUMERO", DataRowVersion.Original)
                                    Case Else
                                        BodegaOri = lDrEncMov("IDBODEGAORIGEN")
                                        TipoDoc = lDrEncMov("IDDOCUMENTO")
                                        NumeroDoc = lDrEncMov("NUMERO")
                                End Select
                                cmd.Parameters.Add("PBODEGAORIGEN", OracleDbType.Varchar2).Value = BodegaOri
                                cmd.Parameters.Add("PPERIODO", OracleDbType.Varchar2).Value = iPeriodo.IDPERIODO
                                cmd.Parameters.Add("PIDCLIENTE", OracleDbType.Varchar2).Value = 0
                                cmd.Parameters.Add("PEXISTENCIANEGATIVA", OracleDbType.Char).Value = IIf(lDesdeRecons, "S", iTipoDoc.existenciasNegativas)
                                cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2)
                                cmd.Parameters.Add("PCANTIDAD", OracleDbType.Int32)
                                cmd.Parameters.Add("PVALOR", OracleDbType.Double)
                                cmd.Parameters.Add("PIDDOCUMENTO", OracleDbType.Varchar2).Value = TipoDoc
                                cmd.Parameters.Add("PNUMERO", OracleDbType.Int32).Value = NumeroDoc
                                cmd.Parameters.Add("PLINEA", OracleDbType.Int32)
                                Dim PCantFinal As OracleParameter = cmd.Parameters.Add("PCANTIDADFINAL", OracleDbType.Int32)
                                PCantFinal.Direction = ParameterDirection.Output
                                For Each lDrDetMov As lbGlobalcom.dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsMov.MOV_MOVIMIENTODETALLE.Rows
                                    AfectaDetalleInvenarios(lDrEncMov, lDrDetMov)
                                    Select Case lDrDetMov.RowState
                                        Case DataRowState.Added
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO").ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD")
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE")
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA")
                                            cmd.ExecuteNonQuery()
                                            If lDesdeRecons = False AndAlso iTipoDoc.existenciasNegativas = "N" Then
                                                lDrDetMov.BeginEdit()
                                                lDrDetMov.CANTIDAD = CInt(PCantFinal.Value.ToString)
                                                lDrDetMov.EndEdit()
                                            End If
                                        Case DataRowState.Modified
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                            cmd.ExecuteNonQuery()
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Current).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Current)
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Current)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Current)
                                            cmd.ExecuteNonQuery()
                                            If lDesdeRecons = False AndAlso iTipoDoc.existenciasNegativas = "N" Then
                                                lDrDetMov.BeginEdit()
                                                lDrDetMov.CANTIDAD = CInt(PCantFinal.Value.ToString)
                                                lDrDetMov.EndEdit()
                                            End If
                                        Case DataRowState.Deleted
                                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                            cmd.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1
                                            cmd.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                            cmd.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                            cmd.ExecuteNonQuery()
                                    End Select
                                Next
                            Case eTipoMovimi.Traslado, eTipoMovimi.TrasladoCodigo, eTipoMovimi.Resmision
                                'Salidas de inventario para el traslado
                                Using cmdSal As OracleCommand = Conn.CreateCommand
                                    cmdSal.CommandText = "INV_ACTUALIZAINVENTARIOSSAL"
                                    cmdSal.CommandType = CommandType.StoredProcedure
                                    Dim BodegaOri As String
                                    Dim TipoDoc As String
                                    Dim NumeroDoc As Integer
                                    Select Case lDrEncMov.RowState
                                        Case DataRowState.Deleted
                                            BodegaOri = lDrEncMov("IDBODEGAORIGEN", DataRowVersion.Original)
                                            TipoDoc = lDrEncMov("IDDOCUMENTO", DataRowVersion.Original)
                                            NumeroDoc = lDrEncMov("NUMERO", DataRowVersion.Original)
                                        Case Else
                                            BodegaOri = lDrEncMov("IDBODEGAORIGEN")
                                            TipoDoc = lDrEncMov("IDDOCUMENTO")
                                            NumeroDoc = lDrEncMov("NUMERO")
                                    End Select
                                    cmdSal.Parameters.Add("PBODEGAORIGEN", OracleDbType.Varchar2).Value = BodegaOri
                                    cmdSal.Parameters.Add("PPERIODO", OracleDbType.Varchar2).Value = iPeriodo.IDPERIODO
                                    cmdSal.Parameters.Add("PIDCLIENTE", OracleDbType.Varchar2).Value = 0
                                    cmdSal.Parameters.Add("PEXISTENCIANEGATIVA", OracleDbType.Char).Value = IIf(lDesdeRecons, "S", iTipoDoc.existenciasNegativas)
                                    cmdSal.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2)
                                    cmdSal.Parameters.Add("PCANTIDAD", OracleDbType.Int32)
                                    cmdSal.Parameters.Add("PVALOR", OracleDbType.Double)
                                    cmdSal.Parameters.Add("PIDDOCUMENTO", OracleDbType.Varchar2).Value = TipoDoc
                                    cmdSal.Parameters.Add("PNUMERO", OracleDbType.Int32).Value = NumeroDoc
                                    cmdSal.Parameters.Add("PLINEA", OracleDbType.Int32)
                                    Dim PCantFinal As OracleParameter = cmdSal.Parameters.Add("PCANTIDADFINAL", OracleDbType.Int32)
                                    PCantFinal.Direction = ParameterDirection.Output
                                    For Each lDrDetMov As lbGlobalcom.dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsMov.MOV_MOVIMIENTODETALLE.Rows
                                        AfectaDetalleInvenarios(lDrEncMov, lDrDetMov)
                                        Dim MovPPack As cMuevePrepack = New cMuevePrepack(lDsMov)
                                        MovPPack = Nothing
                                        Select Case lDrDetMov.RowState
                                            Case DataRowState.Added
                                                cmdSal.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO").ToString.Trim
                                                cmdSal.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD")
                                                cmdSal.Parameters("PVALOR").Value = lDrDetMov("VALORBASE")
                                                cmdSal.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA")
                                                cmdSal.ExecuteNonQuery()
                                                If lDesdeRecons = False AndAlso iTipoDoc.existenciasNegativas = "N" Then
                                                    lDrDetMov.BeginEdit()
                                                    lDrDetMov.CANTIDAD = CInt(PCantFinal.Value.ToString)
                                                    lDrDetMov.EndEdit()
                                                End If
                                            Case DataRowState.Modified
                                                cmdSal.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                                cmdSal.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1
                                                cmdSal.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                                cmdSal.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                                cmdSal.ExecuteNonQuery()
                                                cmdSal.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Current).ToString.Trim
                                                cmdSal.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Current)
                                                cmdSal.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Current)
                                                cmdSal.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Current)
                                                cmdSal.ExecuteNonQuery()
                                                If lDesdeRecons = False AndAlso iTipoDoc.existenciasNegativas = "N" Then
                                                    lDrDetMov.BeginEdit()
                                                    lDrDetMov.CANTIDAD = CInt(PCantFinal.Value.ToString)
                                                    lDrDetMov.EndEdit()
                                                End If
                                            Case DataRowState.Deleted
                                                cmdSal.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                                cmdSal.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1
                                                cmdSal.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                                cmdSal.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                                cmdSal.ExecuteNonQuery()
                                        End Select
                                    Next
                                End Using
                                'Entradas de inventario para el traslado
                                Using cmdEnt As OracleCommand = Conn.CreateCommand
                                    cmdEnt.CommandText = "INV_ACTUALIZAINEVENTARIOENT"
                                    cmdEnt.CommandType = CommandType.StoredProcedure
                                    Dim BodegaPara As String
                                    Dim BodegaOri As String
                                    Dim ExistenciaCliente As String
                                    Dim CCliente As String = "0"
                                    Dim TipoDoc As String = ""
                                    Dim NumeroDoc As Integer = 0
                                    Select Case lDrEncMov.RowState
                                        Case DataRowState.Deleted
                                            BodegaPara = lDrEncMov("IDBODEGADESTINO", DataRowVersion.Original)
                                            BodegaOri = lDrEncMov("IDBODEGAORIGEN", DataRowVersion.Original)
                                            TipoDoc = lDrEncMov("IDDOCUMENTO", DataRowVersion.Original)
                                            NumeroDoc = lDrEncMov("NUMERO", DataRowVersion.Original)
                                            If iTipoDoc.DocEs = eTipoMovimi.Resmision Then
                                                iBodegaOri = New cBodegas(BodegaPara)
                                                ExistenciaCliente = iBodegaOri.ExistenciaCliente
                                                CCliente = lDrEncMov("IDTERCERO", DataRowVersion.Original)
                                            End If
                                        Case Else
                                            BodegaPara = lDrEncMov("IDBODEGADESTINO")
                                            BodegaOri = lDrEncMov("IDBODEGAORIGEN")
                                            TipoDoc = lDrEncMov("IDDOCUMENTO")
                                            NumeroDoc = lDrEncMov("NUMERO")
                                            If iTipoDoc.DocEs = eTipoMovimi.Resmision Then
                                                iBodegaOri = New cBodegas(BodegaPara)
                                                ExistenciaCliente = iBodegaOri.ExistenciaCliente
                                                CCliente = lDrEncMov("IDTERCERO")
                                            End If
                                    End Select
                                    cmdEnt.Parameters.Add("PBODEGAPARA", OracleDbType.Varchar2).Value = BodegaPara
                                    cmdEnt.Parameters.Add("PPERIODO", OracleDbType.Varchar2).Value = iPeriodo.IDPERIODO
                                    cmdEnt.Parameters.Add("PIDCLIENTE", OracleDbType.Varchar2).Value = CCliente
                                    cmdEnt.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2)
                                    cmdEnt.Parameters.Add("PCANTIDAD", OracleDbType.Int32)
                                    cmdEnt.Parameters.Add("PVALOR", OracleDbType.Double)
                                    cmdEnt.Parameters.Add("PIDDOCUMENTO", OracleDbType.Varchar2).Value = TipoDoc
                                    cmdEnt.Parameters.Add("PNUMERO", OracleDbType.Int32).Value = NumeroDoc
                                    cmdEnt.Parameters.Add("PLINEA", OracleDbType.Int32)
                                    cmdEnt.Parameters.Add("PBODEGAORI", OracleDbType.Varchar2).Value = BodegaOri
                                    For Each lDrDetMov As lbGlobalcom.dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsMov.MOV_MOVIMIENTODETALLE.Rows
                                        AfectaDetalleInvenarios(lDrEncMov, lDrDetMov)
                                        Select Case lDrDetMov.RowState
                                            Case DataRowState.Added
                                                If iTipoDoc.DocEs = eTipoMovimi.TrasladoCodigo Then
                                                    cmdEnt.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODDESTINO").ToString.Trim
                                                Else
                                                    cmdEnt.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO").ToString.Trim
                                                End If
                                                cmdEnt.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD")
                                                cmdEnt.Parameters("PVALOR").Value = lDrDetMov("VALORBASE")
                                                cmdEnt.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA")
                                                cmdEnt.ExecuteNonQuery()
                                            Case DataRowState.Modified
                                                If iTipoDoc.DocEs = eTipoMovimi.TrasladoCodigo Then
                                                    cmdEnt.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODDESTINO", DataRowVersion.Original).ToString.Trim
                                                Else
                                                    cmdEnt.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                                End If
                                                cmdEnt.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1
                                                cmdEnt.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                                cmdEnt.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                                cmdEnt.ExecuteNonQuery()
                                                If iTipoDoc.DocEs = eTipoMovimi.TrasladoCodigo Then
                                                    cmdEnt.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODDESTINO", DataRowVersion.Current).ToString.Trim
                                                Else
                                                    cmdEnt.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Current).ToString.Trim
                                                End If

                                                cmdEnt.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Current)
                                                cmdEnt.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Current)
                                                cmdEnt.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Current)
                                                cmdEnt.ExecuteNonQuery()
                                            Case DataRowState.Deleted
                                                If iTipoDoc.DocEs = eTipoMovimi.TrasladoCodigo Then
                                                    cmdEnt.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODDESTINO", DataRowVersion.Original).ToString.Trim
                                                Else
                                                    cmdEnt.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
                                                End If
                                                cmdEnt.Parameters("PCANTIDAD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1
                                                cmdEnt.Parameters("PVALOR").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
                                                cmdEnt.Parameters("PLINEA").Value = lDrDetMov("NUMEROLINEA", DataRowVersion.Original)
                                                cmdEnt.ExecuteNonQuery()
                                        End Select
                                    Next
                                End Using
                        End Select
                    End If
                Next
                Conn.Close()
            End Using
        End Using
    End Sub
    'Public Sub AfectaIventario()
    '    Dim Conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
    '    Dim cmd As OracleCommand = Conn.CreateCommand
    '    cmd.CommandText = "ACTUALIZASALDOINVENTARIOS"
    '    cmd.CommandType = CommandType.StoredProcedure
    '    Try

    '        For Each lDrEncMov As dsMovimiento.MOV_MOVIMIENTORow In lDsMov.MOV_MOVIMIENTO.Rows
    '            If lDsMov.MOV_MOVIMIENTO.Rows.Count > 0 And lDsMov.MOV_MOVIMIENTODETALLE.Rows.Count > 0 Then
    '                If lDrEncMov.RowState = DataRowState.Deleted Then
    '                    lTipoDoc = lDrEncMov("IDDOCUMENTO", DataRowVersion.Original).ToString.Trim
    '                    lNumeroDoc = lDrEncMov("NUMERO", DataRowVersion.Original).ToString.Trim
    '                    lTercero = lDrEncMov("IDTERCERO", DataRowVersion.Original).ToString.Trim
    '                    lBodegaDe = cGeneral.NToCad(lDrEncMov("IDBODEGAORIGEN", DataRowVersion.Original).ToString.Trim)
    '                    lBodegaPara = cGeneral.NToCad(lDrEncMov("IDBODEGADESTINO", DataRowVersion.Original).ToString.Trim)
    '                Else
    '                    lTipoDoc = lDrEncMov("IDDOCUMENTO", DataRowVersion.Current).ToString.Trim
    '                    lNumeroDoc = lDrEncMov("NUMERO", DataRowVersion.Current).ToString.Trim
    '                    lTercero = lDrEncMov("IDTERCERO", DataRowVersion.Current).ToString.Trim
    '                    lBodegaDe = cGeneral.NToCad(lDrEncMov("IDBODEGAORIGEN", DataRowVersion.Current).ToString.Trim)
    '                    lBodegaPara = cGeneral.NToCad(lDrEncMov("IDBODEGADESTINO", DataRowVersion.Current).ToString.Trim)
    '                End If
    '                If lBodegaPara.Trim.Length > 0 Then _
    '                    iBodegaDes = New cBodegas(lBodegaPara)
    '                If lBodegaDe.Trim.Length > 0 Then _
    '                    iBodegaOri = New cBodegas(lBodegaDe)
    '                iTipoDoc = New cTipoDocumento(lTipoDoc)
    '            Else
    '                Throw New Exception("No existe movimiento para afectar inventarios")
    '            End If
    '            cmd.Parameters.Add("PTIPODOC", OracleDbType.Varchar2).Value = lTipoDoc
    '            cmd.Parameters.Add("PBODEGADE", OracleDbType.Varchar2).Value = lBodegaDe.Trim
    '            cmd.Parameters.Add("PBODEGAPARA", OracleDbType.Varchar2).Value = lBodegaPara.Trim
    '            cmd.Parameters.Add("PPERIODO", OracleDbType.Varchar2).Value = iPeriodo.IDPERIODO
    '            cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2)
    '            cmd.Parameters.Add("PIDCLIENTE", OracleDbType.Varchar2)
    '            If (iBodegaDes IsNot Nothing AndAlso iBodegaDes.ExistenciaCliente.ToString.ToUpper = "S") Or (iBodegaOri IsNot Nothing AndAlso iBodegaOri.ExistenciaCliente.ToString.ToUpper = "S") Then
    '                If (iTipoDoc.DocEs = eTipoMovimi.Venta Or iTipoDoc.DocEs = eTipoMovimi.Traslado Or iTipoDoc.DocEs = eTipoMovimi.Resmision) Then
    '                    cmd.Parameters("PIDCLIENTE").Value = lTercero
    '                Else
    '                    cmd.Parameters("PIDCLIENTE").Value = 0
    '                End If
    '            Else
    '                cmd.Parameters("PIDCLIENTE").Value = 0
    '            End If
    '            cmd.Parameters.Add("PCANTIDADOLD", OracleDbType.Int32)
    '            cmd.Parameters.Add("PCANTIDADNEW", OracleDbType.Int32)
    '            cmd.Parameters.Add("PVALOROLD", OracleDbType.Double)
    '            cmd.Parameters.Add("PVALORNEW", OracleDbType.Double)

    '            Dim PCantFinal As OracleParameter = cmd.Parameters.Add("PCANTIDADFINAL", OracleDbType.Int32)
    '            PCantFinal.Direction = ParameterDirection.Output
    '            Conn.Open()

    '            For Each lDrDetMov As lbGlobalcom.dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsMov.MOV_MOVIMIENTODETALLE.Rows
    '                Dim TipoDocDet As String = ""
    '                Dim NumDocDet As Integer = 0
    '                If lDrDetMov.RowState = DataRowState.Deleted Then
    '                    TipoDocDet = lDrDetMov("IDDOCUMENTO", DataRowVersion.Original)
    '                    NumDocDet = lDrDetMov("NUMERO", DataRowVersion.Original)
    '                Else
    '                    TipoDocDet = lDrDetMov("IDDOCUMENTO", DataRowVersion.Current)
    '                    NumDocDet = lDrDetMov("NUMERO", DataRowVersion.Current)
    '                End If
    '                If lTipoDoc = TipoDocDet And lNumeroDoc = NumDocDet Then
    '                    Select Case lDrDetMov.RowState
    '                        Case DataRowState.Added
    '                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO").ToString.Trim
    '                            cmd.Parameters("PCANTIDADOLD").Value = 0
    '                            cmd.Parameters("PCANTIDADNEW").Value = lDrDetMov("CANTIDAD")
    '                            cmd.Parameters("PVALOROLD").Value = 0
    '                            cmd.Parameters("PVALORNEW").Value = lDrDetMov("VALORBASE")
    '                            cmd.ExecuteNonQuery()
    '                            lDrDetMov.BeginEdit()
    '                            lDrDetMov.CANTIDAD = CInt(PCantFinal.Value.ToString)
    '                            lDrDetMov.EndEdit()
    '                        Case DataRowState.Modified
    '                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO").ToString.Trim
    '                            cmd.Parameters("PCANTIDADOLD").Value = lDrDetMov("CANTIDAD", DataRowVersion.Original)
    '                            cmd.Parameters("PCANTIDADNEW").Value = lDrDetMov("CANTIDAD", DataRowVersion.Current)
    '                            cmd.Parameters("PVALOROLD").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
    '                            cmd.Parameters("PVALORNEW").Value = lDrDetMov("VALORBASE", DataRowVersion.Current)
    '                            cmd.ExecuteNonQuery()
    '                            lDrDetMov.BeginEdit()
    '                            lDrDetMov.CANTIDAD = CInt(PCantFinal.Value.ToString)
    '                            lDrDetMov.EndEdit()
    '                        Case DataRowState.Deleted
    '                            cmd.Parameters("PIDPRODUCTO").Value = lDrDetMov("IDPRODUCTO", DataRowVersion.Original).ToString.Trim
    '                            cmd.Parameters("PCANTIDADOLD").Value = 0
    '                            cmd.Parameters("PCANTIDADNEW").Value = lDrDetMov("CANTIDAD", DataRowVersion.Original) * -1
    '                            cmd.Parameters("PVALOROLD").Value = 0
    '                            cmd.Parameters("PVALORNEW").Value = lDrDetMov("VALORBASE", DataRowVersion.Original)
    '                            cmd.ExecuteNonQuery()
    '                    End Select
    '                End If
    '            Next
    '            Conn.Close()
    '        Next
    '    Catch ex As Exception
    '        Throw ex
    '    End Try
    'End Sub
End Class


Public Class cInventarios

    'Private lDtInventarios As AdminVentasDataSet.tbInventariosDataTable
    Private lDrInventa As dsInventarios.INV_INVENTARIOSRow
    Private iCliente As cClientes
    Private lDsMovi As dsMovimiento
    Private iBodega As cBodegas
    Private iProducto As cProducto
    Private lCantOri As Integer
    Private lCantExisNeta As Integer = 0
    Private lIdPrepack As Integer = 0
    Private lIdProducto As String
    Private lNumeroLinea As Integer
    Private lCantidadInventario As Integer = 0
    Private Sub GetSaldoIventario(ByVal IDPREPACK As Byte, ByVal IDPRODUCTO As String, ByVal IDBODEGA As String, ByVal PERIODO As String, ByVal IDCLIENTE As String)
        Using Conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = Conn.CreateCommand
                cmd.CommandText = "INV_EXITENCIASPREPACK"
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.Add("PIDPREPACK", OracleDbType.Int16).Value = IDPREPACK
                cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2).Value = IDPRODUCTO
                cmd.Parameters.Add("PIDBODEGA", OracleDbType.Varchar2).Value = IDBODEGA
                cmd.Parameters.Add("PPERIODO", OracleDbType.Varchar2).Value = PERIODO
                cmd.Parameters.Add("PIDCLIENTE", OracleDbType.Varchar2).Value = IDCLIENTE
                Dim pExist As OracleParameter = _
                    cmd.Parameters.Add("PEXISTENCIA", OracleDbType.Int32)
                pExist.Direction = ParameterDirection.Output
                Try
                    Conn.Open()
                    cmd.ExecuteNonQuery()
                    Conn.Close()
                    lCantExisNeta = pExist.Value.ToString
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub
    Sub New(ByVal dsMovi As dsMovimiento, ByVal Periodo As String, ByVal Bodega As String, ByVal Producto As String, ByVal numeroLinea As Integer, ByVal Cliente As String, ByVal IdPrepack As Integer)
        Try
            lIdPrepack = IdPrepack
            lDsMovi = dsMovi
            lIdProducto = Producto
            lNumeroLinea = numeroLinea
            Dim daInventa As New dsInventariosTableAdapters.INV_INVENTARIOSTableAdapter
            Dim dtInventa As dsInventarios.INV_INVENTARIOSDataTable = daInventa.GetDataByBodegaProductoPeriodoCliente(Bodega, Producto, Periodo, Cliente)
            If dtInventa.Rows.Count > 0 Then
                lDrInventa = dtInventa.Rows(0)
                GetSaldoIventario(IdPrepack, idProducto, idBodega, Periodo, idCliente)
            Else
                lDrInventa = Nothing
                lCantidadInventario = 0
                'Throw New Exception("No hay registro de inventarios para este producto en esta bodega y en este periodo, favor verificar e intentar de nuevo")
            End If

        Catch ex As Exception
            cError.SalvaError(ex, "Samuel")
            Throw ex
        End Try
    End Sub
    Public Function HayExistencias(ByVal drMov As dsMovimiento.MOV_MOVIMIENTODETALLERow, ByVal Cantidad As Int32) As Boolean
        Try
            Dim CantOri As Int32
            Dim cantidadPrepack As Integer = 0
            If drMov Is Nothing Then
                CantOri = 0
            Else
                If drMov.RowState = DataRowState.Modified Or drMov.RowState = DataRowState.Unchanged Then
                    CantOri = cGeneral.NZ(drMov("CANTIDAD", DataRowVersion.Original))
                Else
                    CantOri = 0
                End If
            End If
            'If lIdPrepack > 0 Then
            Dim cMovi As cMovimiento = New cMovimiento(lDsMovi, lIdProducto, lNumeroLinea)
            cantidadPrepack = cMovi.cantidadPrepackCargados()
            'End If
            lCantOri = CantOri

            Dim lExist As Integer = lCantExisNeta + cantidadPrepack
            If lExist < Cantidad Then
                lExist -= lCantOri
            End If
            If (lExist >= Cantidad - CantOri And lExist > 0) Or (Cantidad = 0) Then
                Return True
            Else
                Return False
            End If
        Catch ex As Exception
            cError.SalvaError(ex, "Samuel")
            Throw ex
        End Try
    End Function
    Public ReadOnly Property CantidadOri() As Integer
        Get
            Return lCantOri
        End Get
    End Property
    Public ReadOnly Property Periodo() As String
        Get
            Return lDrInventa.PERIODO
        End Get
    End Property

    Public ReadOnly Property idBodega() As String
        Get
            Return lDrInventa.IDBODEGA
        End Get
    End Property

    Public ReadOnly Property idCliente() As String
        Get
            Return lDrInventa.IDCLIENTE
        End Get
    End Property

    Public ReadOnly Property idProducto() As String
        Get
            Return lDrInventa.IDPRODUCTO
        End Get
    End Property

    Public ReadOnly Property SaldoInicial() As Integer
        Get
            Return cGeneral.NZ(lDrInventa("SALDOINICIAL"))
        End Get
    End Property

    Public ReadOnly Property Compra() As Integer
        Get
            Return cGeneral.NZ(lDrInventa("COMPRA"))
        End Get
    End Property

    Public ReadOnly Property Entradas() As Integer
        Get
            Return cGeneral.NZ(lDrInventa("ENTRADAS"))
        End Get
    End Property

    Public ReadOnly Property Salidas() As Integer
        Get
            Return cGeneral.NZ(lDrInventa("SALIDAS"))
        End Get
    End Property

    Public ReadOnly Property Ventas() As Integer
        Get
            Return cGeneral.NZ(lDrInventa("VENTAS"))
        End Get
    End Property

    Public ReadOnly Property CostoPromedio() As Double
        Get
            Return cGeneral.NZ(lDrInventa("COSTOPROMEDIO"))
        End Get
    End Property

    Public ReadOnly Property VentaPromedio() As Double
        Get
            Return cGeneral.NZ(lDrInventa("VENTAPROMEDIO"))
        End Get
    End Property

    Public ReadOnly Property Existencia() As Integer
        Get
            If lCantidadInventario <> 0 Then
                Return SaldoInicial + Compra + Entradas - Salidas - Ventas
            Else
                Return 0
            End If
        End Get
    End Property
    Public ReadOnly Property ExistenciaNeta() As Integer
        Get
            Return lCantExisNeta
        End Get
    End Property

    Protected Overrides Sub Finalize()
        lDrInventa = Nothing
    End Sub

End Class

Public Class cDetalleInventarios

    Private lDrDetInv As dsInventarios.INV_DETALLERow

    Sub New(ByVal idProducto As String, ByVal idBodega As String, ByVal TipoSubProd As Int16, ByVal NUMEROREGISTRO As String)
        Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = conn.CreateCommand
                cmd.CommandText = "SELECT * FROM INV_DETALLE WHERE IDBODEGA=:PIDBODEGA AND IDPRODUCTO=:PIDPRODUCTO AND TIPOSUBPROD=:PTIPOSUBPROD AND NUMEROREGISTRO=:PNUMEROREGISTRO"
                cmd.Parameters.Add("PIDBODEGA", OracleDbType.Varchar2).Value = idBodega
                cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2).Value = idProducto
                cmd.Parameters.Add("PTIPOSUBPROD", OracleDbType.Int16).Value = TipoSubProd
                cmd.Parameters.Add("PNUMEROREGISTRO", OracleDbType.Varchar2).Value = NUMEROREGISTRO
                Try
                    conn.Open()
                    Dim dtDet As New dsInventarios.INV_DETALLEDataTable
                    dtDet.Load(cmd.ExecuteReader)
                    conn.Close()
                    If dtDet.Rows.Count = 0 Then
                        Throw New Exception("No existe registro en tabla detalle de inventarios, favor verifique e intente de nuevo ")
                    Else
                        lDrDetInv = dtDet.Rows(0)
                    End If
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    Public ReadOnly Property idProducto() As String
        Get
            Return lDrDetInv.IDPRODUCTO
        End Get
    End Property

    Public ReadOnly Property TipoSubProd() As Integer
        Get
            Return lDrDetInv.TIPOSUBPROD
        End Get
    End Property

    Public ReadOnly Property NumeroRegistro() As String
        Get
            Return lDrDetInv.NUMEROREGISTRO
        End Get
    End Property

    Public ReadOnly Property consecutivo() As Int16
        Get
            Return lDrDetInv.CONSECUTIVO
        End Get
    End Property

    Public ReadOnly Property costo() As Double
        Get
            Return lDrDetInv.COSTO
        End Get
    End Property

    Public ReadOnly Property idBodega() As String
        Get
            Return lDrDetInv.IDBODEGA
        End Get
    End Property

    Public ReadOnly Property fechaIngreso() As Date
        Get
            Return lDrDetInv.FECHAINGRESO
        End Get
    End Property

    Public ReadOnly Property Pareja() As String
        Get
            Return lDrDetInv.PAREJA
        End Get
    End Property
    Protected Overrides Sub Finalize()
        lDrDetInv = Nothing
    End Sub
End Class

Public Class cConsultaSaldosInventario
    Private lProducto As String
    Private lBodega As String
    Private lPeriodo As String
    Private lDsInven As dsInventarios
    Public Sub New(ByVal dsinve As dsInventarios, ByVal producto As String, ByVal bodega As String, ByVal periodo As String)
        lProducto = producto
        lBodega = bodega
        lPeriodo = periodo
        lDsInven = dsinve
    End Sub
    Public ReadOnly Property pBodega()
        Get
            Return lBodega
        End Get
    End Property

    Public ReadOnly Property pProducto()
        Get
            Return lProducto
        End Get
    End Property

    Public ReadOnly Property pPeriodo()
        Get
            Return lPeriodo
        End Get
    End Property


    Public Sub consultarSaldo()
        Dim conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
        Dim cmd As OracleCommand = conn.CreateCommand
        Dim entro As Integer = 0
        Dim dt As New Data.DataTable
        Try
            cmd.CommandText = "SELECT INV_INVENTARIOS.IDBODEGA, INV_INVENTARIOS.IDPRODUCTO, INV_INVENTARIOS.PERIODO, INV_INVENTARIOS.IDCLIENTE, INV_INVENTARIOS.COMPRA, INV_INVENTARIOS.COSTOPROMEDIO" & _
                                ", INV_INVENTARIOS.ENTRADAS, INV_INVENTARIOS.SALDOINICIAL, INV_INVENTARIOS.SALIDAS, INV_INVENTARIOS.VENTAPROMEDIO, INV_INVENTARIOS.VENTAS" & _
                                ", INV_INVENTARIOS.ENTRADASPROMEDIO, INV_INVENTARIOS.SALIDASPROMEDIO, INV_INVENTARIOS.INICIALPROMEDIO, INV_INVENTARIOS.SALDOINICIAL + INV_INVENTARIOS.COMPRA + INV_INVENTARIOS.ENTRADAS - INV_INVENTARIOS.SALIDAS - INV_INVENTARIOS.VENTAS AS SALDO " & _
                              " FROM INV_INVENTARIOS,INV_BODEGAS " & _
                              " WHERE INV_INVENTARIOS.IDBODEGA=INV_BODEGAS.IDBODEGA"
            If lProducto.Trim.Length > 0 Then
                cmd.CommandText &= " AND INV_INVENTARIOS.IDPRODUCTO=:PIDPRODUCTO "
                cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2).Value = lProducto
                entro = 1
            End If
            If lBodega.Trim.Length > 0 Then
                cmd.CommandText &= " AND INV_INVENTARIOS.IDBODEGA=:PIDBODEGA "
                cmd.Parameters.Add("PIDBODEGA", OracleDbType.Varchar2).Value = lBodega
            End If
            If lPeriodo.Trim.Length > 0 Then
                cmd.CommandText &= " AND INV_INVENTARIOS.PERIODO=:PPERIODO "
                cmd.Parameters.Add("PPERIODO", OracleDbType.Varchar2).Value = lPeriodo
            End If
            'CustomPrincipal.GetDatosUsuario(CustomPrincipal.IDUsuario)
            If CustomPrincipal.IDSede.Length > 0 Then
                cmd.CommandText &= " AND " & CustomPrincipal.GetFiltroSede(" INV_BODEGAS.IDSEDE ")
            End If
            conn.Open()
            lDsInven.INV_INVENTARIOS.Load(cmd.ExecuteReader)
        Catch ex As Exception
            cError.SalvaError(ex, "Samuel")
            Throw ex
        Finally
            conn.Close()
        End Try
    End Sub
End Class
Public Class cConsultaSaldoDetalle
    Private lBodega As String
    Private lProducto As String
    Private lDsDtalle As dsInventarios
    Public ReadOnly Property pBodega()
        Get
            Return lBodega
        End Get
    End Property
    Public ReadOnly Property pProducto()
        Get
            Return lProducto
        End Get
    End Property
    Public Sub New()

    End Sub

    Public Sub New(ByVal dsDtalle As dsInventarios, ByVal bodega As String, ByVal producto As String)
        lDsDtalle = dsDtalle
        lBodega = bodega
        lProducto = producto
    End Sub

    Public Sub ConsultaSaldosDetalle()
        Dim conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
        Dim cmd As OracleCommand = conn.CreateCommand
        Dim entro As Integer = 0
        Dim dt As New Data.DataTable
        Try
            cmd.CommandText = "SELECT * FROM INV_DETALLE "
            If lProducto.Trim.Length > 0 Then
                cmd.CommandText &= " WHERE "
                cmd.CommandText &= " IDPRODUCTO=:PIDPRODUCTO "
                cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2).Value = lProducto
                entro = 1
            End If
            If lBodega.Trim.Length > 0 Then
                If entro = 1 Then
                    cmd.CommandText &= " AND "
                Else
                    cmd.CommandText &= " WHERE "
                End If
                cmd.CommandText &= "IDBODEGA=:PIDBODEGA "
                cmd.Parameters.Add("PIDBODEGA", OracleDbType.Varchar2).Value = lBodega
            End If
            conn.Open()
            'Dim dt As New Data.DataTable
            'dt.Load(cmd.ExecuteReader)
            'lDsDtalle.INV_DETALLEINVENTARIOS.Merge(dt)
            lDsDtalle.INV_DETALLE.Load(cmd.ExecuteReader)
        Catch ex As Exception
            cError.SalvaError(ex, "Henry")
            Throw ex
        Finally
            conn.Close()
        End Try
    End Sub
    Public Function calculoSaldo(ByVal compras As Integer, ByVal saldoInicial As Integer, ByVal entradas As Integer, ByVal salidas As Integer, ByVal ventas As Integer) As Integer
        Try
            Dim saldo As Integer = saldoInicial + compras + entradas - salidas - ventas
            Return saldo
        Catch ex As Exception
            cError.SalvaError(ex, "Samuel")
            Throw ex
        End Try
    End Function
End Class

Public Class cConsultaDetalleMovimiento
    Private lDsInv As dsConsultaInv
    Public Sub New(ByVal IdProducto As String, ByVal IdBodega As String, ByVal dsConInv As dsConsultaInv, ByVal Periodo As String)
        lDsInv = dsConInv
        Dim iPer As cPeriodos = New cPeriodos(Periodo)
        Try
            lDsInv.Clear()
            Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
                Using cmd As OracleCommand = conn.CreateCommand
                    cmd.CommandText = "SELECT * FROM INV_CONSULTAMOVIMIENTO WHERE (IDBODEGAORIGEN=:PBODEGA OR IDBODEGADESTINO=:PBODEGA1) AND FECHADOCUMENTO BETWEEN :PDESDEF AND :PHASTAF AND (IDPRODUCTO=:PPRODUCTO OR (IDPRODDESTINO=:PPRODUCTO1 AND IDBODEGADESTINO=:PBODEGA2)) ORDER BY FECHADOCUMENTO "
                    cmd.Parameters.Add("PBODEGA", OracleDbType.Varchar2).Value = IdBodega
                    cmd.Parameters.Add("PBODEGA1", OracleDbType.Varchar2).Value = IdBodega
                    cmd.Parameters.Add("PDESDEF", OracleDbType.Date).Value = iPer.DESDEF
                    cmd.Parameters.Add("PHASTAF", OracleDbType.Date).Value = iPer.HASTAF
                    cmd.Parameters.Add("PPRODUCTO", OracleDbType.Varchar2).Value = IdProducto
                    cmd.Parameters.Add("PPRODUCTO1", OracleDbType.Varchar2).Value = IdProducto
                    cmd.Parameters.Add("PBODEGA2", OracleDbType.Varchar2).Value = IdBodega
                    Try
                        conn.Open()
                        lDsInv.INV_CONSULTAMOVIMIENTO.Load(cmd.ExecuteReader)
                        conn.Close()
                    Catch ex As Exception
                        Throw ex
                    End Try
                End Using
            End Using
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
End Class

Public Class cValoraNotas
    Dim lDSInfo As dsConsultaMovimi
    Private lCargaPrepack As Boolean = False
    Public Sub CargaPrepack(ByVal Conn As OracleConnection)
        Try
            Dim TemDtInfoNotas As New dsConsultaMovimi.INFONOTASCREDITODataTable
            Dim Cmd As OracleCommand = Conn.CreateCommand
            Cmd.CommandText = "SELECT MOV_MOVIMIENTO.IDDOCUMENTO, MOV_MOVIMIENTO.NUMERO, MOV_MOVIMIENTO.FECHADOCUMENTO, MOV_MOVIMIENTODETALLE.IDPRODUCTO, MOV_DESCRIPCIONDET.TIPOSUBPROD, MOV_DESCRIPCIONDET.NUMEROREGISTRO, MOV_DESCRIPCIONDET.NUMEROPRODUCTO, MOV_MOVIMIENTODETALLE.DESCUENTO1, MOV_MOVIMIENTODETALLE.DESCUENTO2, MOV_MOVIMIENTODETALLE.VALORBASE, MOV_MOVIMIENTODETALLE.VALORIVA, MOV_MOVIMIENTODETALLE.IDIVA " & _
                                        "FROM MOV_MOVIMIENTO, MOV_DESCRIPCIONDET, MOV_MOVIMIENTODETALLE, GLO_TIPODOCUMENTO, INV_DETALLE " & _
                                        "WHERE MOV_MOVIMIENTO.IDDOCUMENTO=MOV_MOVIMIENTODETALLE.IDDOCUMENTO AND MOV_MOVIMIENTODETALLE.IDDOCUMENTO=MOV_DESCRIPCIONDET.IDDOCUMENTO AND MOV_MOVIMIENTO.NUMERO=MOV_MOVIMIENTODETALLE.NUMERO AND MOV_MOVIMIENTODETALLE.NUMERO=MOV_DESCRIPCIONDET.NUMERO AND MOV_MOVIMIENTODETALLE.NUMEROLINEA=MOV_DESCRIPCIONDET.NUMEROLINEA AND MOV_MOVIMIENTODETALLE.IDPRODUCTO=MOV_DESCRIPCIONDET.IDPRODUCTO AND MOV_DESCRIPCIONDET.TIPOSUBPROD = INV_DETALLE.TIPOSUBPROD(+) AND MOV_DESCRIPCIONDET.NUMEROREGISTRO = INV_DETALLE.NUMEROREGISTRO(+) AND MOV_MOVIMIENTO.IDDOCUMENTO=GLO_TIPODOCUMENTO.TIPODOC AND GLO_TIPODOCUMENTO.DOCES=4 AND MOV_MOVIMIENTODETALLE.IDPRODUCTO = :PIDPRODUCTO AND MOV_DESCRIPCIONDET.TIPOSUBPROD=:PTIPOSUBPROD AND MOV_DESCRIPCIONDET.NUMEROREGISTRO=:PNUMEROREGISTRO " & _
                                        "ORDER BY MOV_MOVIMIENTO.IDDOCUMENTO, MOV_MOVIMIENTO.NUMERO, MOV_DESCRIPCIONDET.TIPOSUBPROD "
            Cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2)
            Cmd.Parameters.Add("PTIPOSUBPROD", OracleDbType.Int16)
            Cmd.Parameters.Add("PNUMEROREGISTRO", OracleDbType.Varchar2)
            Conn.Open()
            For Each drInfo As dsConsultaMovimi.INFONOTASCREDITORow In lDSInfo.INFONOTASCREDITO.Rows
                Dim iProd As cProducto = New cProducto(drInfo.IDPRODUCTO)
                Dim iCargaPPack As New GetDatosPrepack(drInfo.IDPRODUCTO, drInfo.TIPOSUBPROD, drInfo.NUMEROREGISTRO)

                Dim PPack As cPrepack = New cPrepack(drInfo.TIPOSUBPROD, drInfo.NUMEROREGISTRO, IIf(iProd.EsPadre.ToUpper = "S", True, False))
                If iCargaPPack.EsPrepack Then
                    For Each dr As dsInvenConsultas.INV_GETPREPACKRow In iCargaPPack.Prepack.Rows
                        If Not dr.IsIDPRODUCTOPNull Then
                            Cmd.Parameters("PIDPRODUCTO").Value = dr.IDPRODUCTOP
                            Cmd.Parameters("PTIPOSUBPROD").Value = dr.TIPOSUBPROP
                            Cmd.Parameters("PNUMEROREGISTRO").Value = dr.NUMEROREGISTROP
                            TemDtInfoNotas.Load(Cmd.ExecuteReader)
                        End If
                        If Not dr.IsIDPRODUCTOHNull Then
                            Cmd.Parameters("PIDPRODUCTO").Value = dr.IDPRODUCTOH
                            Cmd.Parameters("PTIPOSUBPROD").Value = dr.TIPOSUBPRODH
                            Cmd.Parameters("PNUMEROREGISTRO").Value = dr.NUMEROREGISTROH
                            TemDtInfoNotas.Load(Cmd.ExecuteReader)
                        End If
                    Next
                End If
            Next
            Conn.Close()
            lDSInfo.INFONOTASCREDITO.Merge(TemDtInfoNotas)
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
    Public Sub New(ByVal IMEI As String)
        Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = conn.CreateCommand
                Dim EsInvetario As String = ""
                Dim qSelect As String = "SELECT MOV_MOVIMIENTO.IDDOCUMENTO, MOV_MOVIMIENTO.NUMERO, MOV_MOVIMIENTO.FECHADOCUMENTO, MOV_MOVIMIENTODETALLE.IDPRODUCTO, MOV_DESCRIPCIONDET.TIPOSUBPROD, MOV_DESCRIPCIONDET.NUMEROREGISTRO, MOV_DESCRIPCIONDET.NUMEROPRODUCTO, MOV_MOVIMIENTODETALLE.DESCUENTO1, MOV_MOVIMIENTODETALLE.DESCUENTO2, MOV_MOVIMIENTODETALLE.VALORBASE, MOV_MOVIMIENTODETALLE.VALORIVA, MOV_MOVIMIENTODETALLE.IDIVA "
                Dim qFrom As String = "FROM MOV_MOVIMIENTO, MOV_DESCRIPCIONDET, MOV_MOVIMIENTODETALLE, GLO_TIPODOCUMENTO, INV_DETALLE "
                Dim qWhere As String = "WHERE MOV_MOVIMIENTO.IDDOCUMENTO=MOV_MOVIMIENTODETALLE.IDDOCUMENTO AND MOV_MOVIMIENTODETALLE.IDDOCUMENTO=MOV_DESCRIPCIONDET.IDDOCUMENTO AND MOV_MOVIMIENTO.NUMERO=MOV_MOVIMIENTODETALLE.NUMERO AND MOV_MOVIMIENTODETALLE.NUMERO=MOV_DESCRIPCIONDET.NUMERO AND MOV_MOVIMIENTODETALLE.NUMEROLINEA=MOV_DESCRIPCIONDET.NUMEROLINEA AND MOV_MOVIMIENTODETALLE.IDPRODUCTO=MOV_DESCRIPCIONDET.IDPRODUCTO AND MOV_DESCRIPCIONDET.TIPOSUBPROD = INV_DETALLE.TIPOSUBPROD(+) AND MOV_DESCRIPCIONDET.NUMEROREGISTRO = INV_DETALLE.NUMEROREGISTRO(+) AND MOV_MOVIMIENTO.IDDOCUMENTO=GLO_TIPODOCUMENTO.TIPODOC AND GLO_TIPODOCUMENTO.DOCES=4 AND MOV_DESCRIPCIONDET.TIPOSUBPROD=1 AND MOV_DESCRIPCIONDET.NUMEROREGISTRO = :PNUMEROREG " & EsInvetario
                Dim qOrder As String = "ORDER BY MOV_MOVIMIENTO.IDDOCUMENTO, MOV_MOVIMIENTO.NUMERO, MOV_DESCRIPCIONDET.TIPOSUBPROD "
                cmd.Parameters.Add("PNUMEROREG", OracleDbType.Varchar2).Value = IMEI
                cmd.CommandText = qSelect + " " + qFrom + " " + qWhere
                Try
                    conn.Open()
                    lDSInfo = New dsConsultaMovimi
                    lDSInfo.INFONOTASCREDITO.Load(cmd.ExecuteReader)
                    conn.Close()
                    CargaPrepack(conn)
                    For Each dr As dsConsultaMovimi.INFONOTASCREDITORow In lDSInfo.INFONOTASCREDITO.Rows
                        dr._SELECT = True
                        dr.EsPrepack = True
                    Next
                Catch ex As Exception
                    cError.SalvaError(ex, "Samuel")
                    Throw ex
                End Try
            End Using
        End Using
    End Sub
    Public Sub New(ByVal IDCLIENTE As String, ByVal SUCURSAL As Int16, ByVal IDPRODUCTO As String, ByVal TipoNota As String, Optional ByVal DesdeF As DateTime = #1/1/1900#, Optional ByVal TIPODOC As String = "", Optional ByVal NUMERO As Integer = 0)
        Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = conn.CreateCommand
                Dim EsInvetario As String = ""
                If TipoNota = "NCV" Then
                    EsInvetario = " AND INV_DETALLE.IDBODEGA IS NULL "
                ElseIf TipoNota = "NDC" Then
                    EsInvetario = " AND NOT INV_DETALLE.IDBODEGA IS NULL "
                End If
                Dim qSelect As String = "SELECT MOV_MOVIMIENTO.IDDOCUMENTO, MOV_MOVIMIENTO.NUMERO, MOV_MOVIMIENTO.FECHADOCUMENTO, MOV_MOVIMIENTODETALLE.IDPRODUCTO, MOV_DESCRIPCIONDET.TIPOSUBPROD, MOV_DESCRIPCIONDET.NUMEROREGISTRO, MOV_DESCRIPCIONDET.NUMEROPRODUCTO, MOV_MOVIMIENTODETALLE.DESCUENTO1, MOV_MOVIMIENTODETALLE.DESCUENTO2, MOV_MOVIMIENTODETALLE.VALORBASE, MOV_MOVIMIENTODETALLE.VALORIVA, MOV_MOVIMIENTODETALLE.IDIVA "
                Dim qFrom As String = "FROM MOV_MOVIMIENTO, MOV_DESCRIPCIONDET, MOV_MOVIMIENTODETALLE, GLO_TIPODOCUMENTO, INV_DETALLE "
                Dim qWhere As String = "WHERE MOV_MOVIMIENTO.IDDOCUMENTO=MOV_MOVIMIENTODETALLE.IDDOCUMENTO AND MOV_MOVIMIENTODETALLE.IDDOCUMENTO=MOV_DESCRIPCIONDET.IDDOCUMENTO AND MOV_MOVIMIENTO.NUMERO=MOV_MOVIMIENTODETALLE.NUMERO AND MOV_MOVIMIENTODETALLE.NUMERO=MOV_DESCRIPCIONDET.NUMERO AND MOV_MOVIMIENTODETALLE.NUMEROLINEA=MOV_DESCRIPCIONDET.NUMEROLINEA AND MOV_MOVIMIENTODETALLE.IDPRODUCTO=MOV_DESCRIPCIONDET.IDPRODUCTO AND MOV_DESCRIPCIONDET.TIPOSUBPROD = INV_DETALLE.TIPOSUBPROD(+) AND MOV_DESCRIPCIONDET.NUMEROREGISTRO = INV_DETALLE.NUMEROREGISTRO(+) AND MOV_MOVIMIENTO.IDTERCERO = :PIDCLIENTE AND MOV_MOVIMIENTO.IDDOCUMENTO=GLO_TIPODOCUMENTO.TIPODOC AND GLO_TIPODOCUMENTO.DOCES=4 AND MOV_MOVIMIENTO.SUCURSAL = :PSUSCURSAL " & EsInvetario
                Dim qOrder As String = "ORDER BY MOV_MOVIMIENTO.IDDOCUMENTO, MOV_MOVIMIENTO.NUMERO, MOV_DESCRIPCIONDET.TIPOSUBPROD "
                cmd.Parameters.Add("PIDCLIENTE", OracleDbType.Varchar2).Value = IDCLIENTE
                cmd.Parameters.Add("PSUSCURSAL", OracleDbType.Int16).Value = SUCURSAL
                If TIPODOC.Trim.Length > 0 And NUMERO <> 0 Then
                    qWhere &= " AND MOV_MOVIMIENTO.IDDOCUMENTO = :PIDDOCUMENTO AND MOV_MOVIMIENTO.NUMERO = :PNUMERO"
                    cmd.Parameters.Add("PIDDOCUMENTO", OracleDbType.Varchar2).Value = TIPODOC
                    cmd.Parameters.Add("PNUMERO", OracleDbType.Int32).Value = NUMERO
                Else
                    If IDPRODUCTO.Trim.Length > 0 Then
                        lCargaPrepack = True
                        qWhere &= " AND MOV_DESCRIPCIONDET.IDPRODUCTO = :PIDPRODUCTO"
                        cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2).Value = IDPRODUCTO
                    End If
                    qWhere &= " AND MOV_MOVIMIENTO.FECHADOCUMENTO >= :PDESDEF"
                    cmd.Parameters.Add("PDESDEF", OracleDbType.Date).Value = DesdeF
                End If
                cmd.CommandText = qSelect + " " + qFrom + " " + qWhere
                Try
                    conn.Open()
                    lDSInfo = New dsConsultaMovimi
                    lDSInfo.INFONOTASCREDITO.Load(cmd.ExecuteReader)
                    conn.Close()
                    If lCargaPrepack Then _
                        CargaPrepack(conn)
                Catch ex As Exception
                    cError.SalvaError(ex, "Samuel")
                    Throw ex
                End Try
            End Using
        End Using
    End Sub
    Public Sub New(ByVal IDPROVEEDOR As String, ByVal IDPRODUCTO As String, Optional ByVal DesdeF As DateTime = #1/1/1900#, Optional ByVal TIPODOC As String = "", Optional ByVal NUMERO As Integer = 0)
        Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = conn.CreateCommand
                Dim EsInvetario As String = " AND NOT INV_DETALLE.IDBODEGA IS NULL "
                Dim qSelect As String = "SELECT MOV_MOVIMIENTO.IDDOCUMENTO, MOV_MOVIMIENTO.NUMERO, MOV_MOVIMIENTO.FECHADOCUMENTO, MOV_MOVIMIENTODETALLE.IDPRODUCTO, MOV_DESCRIPCIONDET.TIPOSUBPROD, MOV_DESCRIPCIONDET.NUMEROREGISTRO, MOV_DESCRIPCIONDET.NUMEROPRODUCTO, MOV_MOVIMIENTODETALLE.DESCUENTO1, MOV_MOVIMIENTODETALLE.DESCUENTO2, MOV_MOVIMIENTODETALLE.VALORBASE, MOV_MOVIMIENTODETALLE.VALORIVA, MOV_MOVIMIENTODETALLE.IDIVA "
                Dim qFrom As String = "FROM MOV_MOVIMIENTO, MOV_DESCRIPCIONDET, MOV_MOVIMIENTODETALLE, GLO_TIPODOCUMENTO, INV_DETALLE "
                Dim qWhere As String = "WHERE MOV_MOVIMIENTO.IDDOCUMENTO=MOV_MOVIMIENTODETALLE.IDDOCUMENTO AND MOV_MOVIMIENTODETALLE.IDDOCUMENTO=MOV_DESCRIPCIONDET.IDDOCUMENTO AND MOV_MOVIMIENTO.NUMERO=MOV_MOVIMIENTODETALLE.NUMERO AND MOV_MOVIMIENTODETALLE.NUMERO=MOV_DESCRIPCIONDET.NUMERO AND MOV_MOVIMIENTODETALLE.NUMEROLINEA=MOV_DESCRIPCIONDET.NUMEROLINEA AND MOV_MOVIMIENTODETALLE.IDPRODUCTO=MOV_DESCRIPCIONDET.IDPRODUCTO  AND MOV_DESCRIPCIONDET.TIPOSUBPROD = INV_DETALLE.TIPOSUBPROD(+) AND MOV_DESCRIPCIONDET.NUMEROREGISTRO = INV_DETALLE.NUMEROREGISTRO(+) AND MOV_MOVIMIENTO.IDDOCUMENTO=GLO_TIPODOCUMENTO.TIPODOC AND GLO_TIPODOCUMENTO.DOCES=5 AND MOV_MOVIMIENTO.IDTERCERO = :PIDPROVEEDOR " + EsInvetario
                cmd.Parameters.Add("PIDPROVEEDOR", OracleDbType.Varchar2).Value = IDPROVEEDOR
                If TIPODOC.Trim.Length > 0 And NUMERO <> 0 Then
                    qWhere &= " AND MOV_MOVIMIENTO.IDDOCUMENTO = :PIDDOCUMENTO AND MOV_MOVIMIENTO.NUMERO = :PNUMERO"
                    cmd.Parameters.Add("PIDDOCUMENTO", OracleDbType.Varchar2).Value = TIPODOC
                    cmd.Parameters.Add("PNUMERO", OracleDbType.Int32).Value = NUMERO
                Else
                    If IDPRODUCTO.Trim.Length > 0 Then
                        qWhere &= " AND MOV_DESCRIPCIONDET.IDPRODUCTO = :PIDPRODUCTO"
                        cmd.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2).Value = IDPRODUCTO
                    End If
                    qWhere &= " AND MOV_MOVIMIENTO.FECHADOCUMENTO >= :PDESDEF"
                    cmd.Parameters.Add("PDESDEF", OracleDbType.Date).Value = DesdeF
                End If
                cmd.CommandText = qSelect + " " + qFrom + " " + qWhere
                Try
                    conn.Open()
                    lDSInfo = New dsConsultaMovimi
                    lDSInfo.INFONOTASCREDITO.Load(cmd.ExecuteReader)
                    conn.Close()
                Catch ex As Exception
                    cError.SalvaError(ex, "Samuel")
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    Public ReadOnly Property InfoByNota() As dsConsultaMovimi
        Get
            Return lDSInfo
        End Get
    End Property
    Function GetNumerolinea(ByVal dsMov As dsMovimiento) As Int32
        If dsMov.MOV_MOVIMIENTODETALLE.Rows.Count > 0 Then
            Return dsMov.MOV_MOVIMIENTODETALLE.Rows(dsMov.MOV_MOVIMIENTODETALLE.Rows.Count - 1)("NUMEROLINEA")
        Else
            Return 0
        End If
    End Function
    Private Function GetRegistroDetalle(ByVal idProducto As String, ByVal dsMov As dsMovimiento) As dsMovimiento.MOV_MOVIMIENTODETALLERow
        For Each drMovDet As dsMovimiento.MOV_MOVIMIENTODETALLERow In dsMov.MOV_MOVIMIENTODETALLE.Rows
            If drMovDet.IDPRODUCTO = idProducto Then
                Return drMovDet
            End If
        Next
        Return Nothing
    End Function
    Private Sub InsertaDetalle(ByVal dsMov As dsMovimiento, ByVal IdProducto As String, ByVal Dto1 As Double, ByVal Dto2 As Double, ByVal VrBase As Double, ByVal vrIva As Double, ByVal IdIva As Int16, ByVal Cant As Integer)
        Dim drDet As dsMovimiento.MOV_MOVIMIENTODETALLERow = GetRegistroDetalle(IdProducto, dsMov)
        If drDet IsNot Nothing Then
            drDet.CANTIDAD += 1 / Cant
        Else
            drDet = dsMov.MOV_MOVIMIENTODETALLE.NewMOV_MOVIMIENTODETALLERow
            drDet.IDDOCUMENTO = dsMov.MOV_MOVIMIENTO.Rows(0)("IDDOCUMENTO")
            drDet.NUMERO = dsMov.MOV_MOVIMIENTO.Rows(0)("NUMERO")
            drDet.NUMEROLINEA = GetNumerolinea(dsMov) + 1
            drDet.IDPRODUCTO = IdProducto
            drDet.CANTIDAD = 1 / Cant
            drDet.DESCUENTO1 = Dto1
            drDet.DESCUENTO2 = Dto2
            drDet.VALORBASE = VrBase
            drDet.VALORIVA = vrIva
            drDet.VALORLINEA = 0
            drDet.IDIVA = IdIva
            dsMov.MOV_MOVIMIENTODETALLE.Rows.Add(drDet)
        End If

    End Sub
    Private Sub InsertaDescDetalle(ByVal dsMov As dsMovimiento, ByVal idProducto As String, ByVal TipoSubProd As Integer, ByVal NumeroRegsitro As String, ByVal NumeroProducto As Integer)
        Dim drDet As dsMovimiento.MOV_MOVIMIENTODETALLERow = GetRegistroDetalle(idProducto, dsMov)
        If drDet IsNot Nothing Then
            Dim drDescMov As dsMovimiento.MOV_DESCRIPCIONDETRow = dsMov.MOV_DESCRIPCIONDET.NewMOV_DESCRIPCIONDETRow
            drDescMov.IDDOCUMENTO = drDet.IDDOCUMENTO
            drDescMov.NUMERO = drDet.NUMERO
            drDescMov.TIPOSUBPROD = TipoSubProd
            drDescMov.NUMEROREGISTRO = NumeroRegsitro
            drDescMov.IDPRODUCTO = idProducto
            drDescMov.NUMEROLINEA = drDet.NUMEROLINEA
            drDescMov.NUMEROPRODUCTO = NumeroProducto
            dsMov.MOV_DESCRIPCIONDET.Rows.Add(drDescMov)
        Else
            Throw New Exception("No ecuentro producto con Id " & idProducto & ", Para insertar Descripcion Detalle")
        End If
    End Sub
    Private Sub RedondeaCantidad(ByVal dsMov As dsMovimiento)
        For Each drDet As dsMovimiento.MOV_MOVIMIENTODETALLERow In dsMov.MOV_MOVIMIENTODETALLE.Rows
            drDet.CANTIDAD = Math.Round(drDet.CANTIDAD)
        Next
    End Sub

    Public Function validaNumeroRegistro(ByVal dsMov As dsMovimiento, ByVal producto As String, ByVal tipoSubProd As Integer, ByVal numeroRegistro As String, ByVal numeroProducto As Integer) As Boolean
        Try
            For Each drMov As dsMovimiento.MOV_DESCRIPCIONDETRow In dsMov.MOV_DESCRIPCIONDET
                If drMov.IDPRODUCTO = producto And drMov.TIPOSUBPROD = tipoSubProd And drMov.NUMEROREGISTRO = numeroRegistro And drMov.NUMEROPRODUCTO = numeroProducto Then
                    Return True
                End If
            Next
            Return False
        Catch ex As Exception
            Throw ex
        End Try
    End Function



    Public Sub InsertaProductosNota(ByVal dsMov As dsMovimiento)
        Dim CodigoAnt As String = ""
        Dim NumLinea As Int16 = GetNumerolinea(dsMov)
        Dim Canditad As Integer = 0
        For Each drInfo As dsConsultaMovimi.INFONOTASCREDITORow In lDSInfo.INFONOTASCREDITO.Rows
            Dim Cantidad As Integer = 1
            If drInfo.EsPrepack Then
                Dim DatosPPack As New GetDatosPrepack(drInfo.IDPRODUCTO, drInfo.TIPOSUBPROD, drInfo.NUMEROREGISTRO)
                If DatosPPack.PPackEsPadre Then
                    Canditad = DatosPPack.TipoPPack.CantidadIMEI
                Else
                    Canditad = DatosPPack.TipoPPack.CantidadICCID
                End If
            Else
                Cantidad = 1
            End If
            If validaNumeroRegistro(dsMov, drInfo.IDPRODUCTO, drInfo.TIPOSUBPROD, drInfo.NUMEROREGISTRO, drInfo.NUMEROPRODUCTO) Then

            Else
                InsertaDetalle(dsMov, drInfo.IDPRODUCTO, drInfo.DESCUENTO1, drInfo.DESCUENTO2, drInfo.VALORBASE, drInfo.VALORIVA, cGeneral.NZ(drInfo("IDIVA")), Canditad)
                InsertaDescDetalle(dsMov, drInfo.IDPRODUCTO, drInfo.TIPOSUBPROD, drInfo.NUMEROREGISTRO, drInfo.NUMEROPRODUCTO)
            End If
        Next
        RedondeaCantidad(dsMov)
    End Sub
End Class
Public Class cCargaDetalleInvNoPrepack
    Private ldsMovimi As dsMovimiento
    Private lPPackSel As lbGlobalcom.cPrepacksSelect
    Private lFila As Integer
    Private Sub InsertaMovimi()
        Dim drPadre As dsMovimiento.MOV_MOVIMIENTODETALLERow = ldsMovimi.MOV_MOVIMIENTODETALLE.Rows(lFila)
        Dim drDescDet As dsMovimiento.MOV_DESCRIPCIONDETRow = ldsMovimi.MOV_DESCRIPCIONDET.NewMOV_DESCRIPCIONDETRow
        drDescDet.SetParentRow(drPadre, ldsMovimi.Relations("FK_MOV_MOVIMIENTODETALLE_MOV_DESCRIPCIONDET"))
        drDescDet.IDPRODUCTO = lPPackSel.Producto
        drDescDet.TIPOSUBPROD = lPPackSel.TipoSubProd
        drDescDet.NUMEROREGISTRO = lPPackSel.NumeroRegP
        drDescDet.NUMEROPRODUCTO = lPPackSel.Consecutivo
        Dim iInv As New cDetalleInventarios(lPPackSel.Producto, lPPackSel.Bodega, lPPackSel.TipoSubProd, lPPackSel.NumeroRegP)
        drDescDet.COSTO = iInv.costo
        iInv = Nothing
        ldsMovimi.MOV_DESCRIPCIONDET.Rows.Add(drDescDet)
    End Sub
    Public Sub New(ByVal dsMov As dsMovimiento, ByVal PPackSel As lbGlobalcom.cPrepacksSelect, ByVal Fila As Integer)
        lFila = Fila
        ldsMovimi = dsMov
        lPPackSel = PPackSel
        InsertaMovimi()
    End Sub
End Class
Public Class cCargaDetalleInvPrepacks
    Dim DtDetInvPrepack As dsInvenConsultas.INV_CONSULTAPREPACKDataTable
    Dim lCantidadDetalle As Integer = 0
    Public lTipoPrepack As Integer
    Public Sub New(ByVal idprepack As Integer, ByVal idProducto As String, ByVal consecutivo As Integer, ByVal idtipoprepack As Integer, ByVal bodega As String)
        Dim qSelect As String = "SELECT * FROM INV_VPREPACKS "
        Dim qWhere As String = " WHERE "
        Dim CuentaW As Byte = 0
        Dim iProd As cProducto = New cProducto(idProducto)
        Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = conn.CreateCommand
                If bodega.ToString.Length > 0 Then
                    If CuentaW > 0 Then
                        qWhere &= " AND "
                    End If
                    CuentaW += 1
                    qWhere &= "IDBODEGA=:PBODEGA"
                    cmd.Parameters.Add(":PBODEGA", OracleDbType.Varchar2).Value = bodega
                End If
                If idprepack.ToString.Length > 0 Then
                    If CuentaW > 0 Then
                        qWhere &= " AND "
                    End If
                    CuentaW += 1
                    qWhere &= "IDPREPACK=:PIDPREPACK"
                    cmd.Parameters.Add(":PIDPREPACK", OracleDbType.Int32).Value = idprepack
                End If
                If consecutivo.ToString.Length > 0 Then
                    If CuentaW > 0 Then
                        qWhere &= " AND "
                    End If
                    CuentaW += 1
                    qWhere &= "CONSECPREPACK=:PCONSECUTIVO"
                    cmd.Parameters.Add(":PCONSECUTIVO", OracleDbType.Int32).Value = consecutivo
                End If
                If idtipoprepack.ToString.Length > 0 Then
                    If CuentaW > 0 Then
                        qWhere += " AND "
                    End If
                    CuentaW += 1
                    qWhere += "IDTIPOPREPACK=:PIDTIPOPREPACK"
                    cmd.Parameters.Add(":PIDTIPOPREPACK", OracleDbType.Int32).Value = idtipoprepack
                    lTipoPrepack = idtipoprepack
                End If
                cmd.CommandText = qSelect + qWhere
                conn.Open()
                DtDetInvPrepack = New dsInvenConsultas.INV_CONSULTAPREPACKDataTable
                DtDetInvPrepack.Load(cmd.ExecuteReader)
                lCantidadDetalle = DtDetInvPrepack.Rows.Count / iProd.CantidadSubProd
            End Using
        End Using


    End Sub

    Public Sub InsertaDatos(ByVal dsMov As dsMovimiento, ByVal FilaDetalle As Integer, ByVal ListaP As String)
        Dim TipoPrep As dsInventariosTableAdapters.INV_TIPOSPREPACKSTableAdapter
        TipoPrep = New dsInventariosTableAdapters.INV_TIPOSPREPACKSTableAdapter
        For Each drConsDet As dsInvenConsultas.INV_CONSULTAPREPACKRow In DtDetInvPrepack.Rows
            Dim drTipoPrep As dsInventarios.INV_TIPOSPREPACKSRow = TipoPrep.GetDataByIdPreack(lTipoPrepack).Rows(0)
            InsertaDescripDetalle(New cDetalleInventarios(drConsDet.IDPRODUCTOP, drConsDet.IDBODEGA, drConsDet.TIPOSUBPROP, drConsDet.NUMEROREGISTROP), dsMov, FilaDetalle, drTipoPrep.CANTIMEI)
        Next
        Dim dtAgrupa As dsInvenConsultas.INV_AGRUPACODIGOSTMPDataTable = InsertaMovDetalle(dsMov, AgrupaByCodigo(), ListaP)
        For Each drConsDet As dsInvenConsultas.INV_CONSULTAPREPACKRow In DtDetInvPrepack.Rows
            If drConsDet("IDPRODUCTOH") IsNot DBNull.Value Then
                Dim drAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPRow = dtAgrupa.Rows.Find(New Object() {drConsDet.IDPRODUCTOH})
                Dim drTipoPrep As dsInventarios.INV_TIPOSPREPACKSRow = TipoPrep.GetDataByIdPreack(lTipoPrepack).Rows(0)
                InsertaDescripDetalle(New cDetalleInventarios(drConsDet.IDPRODUCTOH, drConsDet.IDBODEGA, drConsDet.TIPOSUBPRODH, drConsDet.NUMEROREGISTROH), dsMov, drAgrpa.FILA, drTipoPrep.CANTICCID)
            End If
        Next
    End Sub

    Private Function AgrupaByCodigo() As dsInvenConsultas.INV_AGRUPACODIGOSTMPDataTable
        Dim DtAgrupa As New dsInvenConsultas.INV_AGRUPACODIGOSTMPDataTable
        For Each drConsDet As dsInvenConsultas.INV_CONSULTAPREPACKRow In DtDetInvPrepack.Rows
            If drConsDet("IDPRODUCTOH") IsNot DBNull.Value Then
                Dim drAgrupa As dsInvenConsultas.INV_AGRUPACODIGOSTMPRow = DtAgrupa.Rows.Find(New Object() {drConsDet.IDPRODUCTOH})
                If drAgrupa IsNot Nothing Then
                    drAgrupa.CANTIDAD += 1
                Else
                    drAgrupa = DtAgrupa.NewINV_AGRUPACODIGOSTMPRow
                    drAgrupa.IDPRODUCTO = drConsDet.IDPRODUCTOH
                    drAgrupa.CANTIDAD += 1
                    DtAgrupa.Rows.Add(drAgrupa)
                End If
                drAgrupa = Nothing
            End If
        Next
        Return DtAgrupa
    End Function

    Private Function encontrarRegistroHijo(ByVal dsmov As dsMovimiento, ByVal drAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPRow) As Integer
        Try
            For Each drMov As dsMovimiento.MOV_MOVIMIENTODETALLERow In dsmov.MOV_MOVIMIENTODETALLE.Rows
                If drAgrpa("IDPRODUCTO") = drMov("IDPRODUCTO") Then
                    Return 1
                End If
            Next
            Return 0
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Private Function InsertaMovDetalle(ByVal dsMov As dsMovimiento, ByVal dtAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPDataTable, ByVal idLista As String) As dsInvenConsultas.INV_AGRUPACODIGOSTMPDataTable
        Try
            If dsMov.MOV_MOVIMIENTODETALLE.Rows.Count > 0 Then
                Dim nuevo As Integer = encontrarRegistroHijo(dsMov, dtAgrpa.Rows(0))
                If nuevo = 0 Then
                    Dim drMovDet As dsMovimiento.MOV_MOVIMIENTODETALLERow
                    drMovDet = dsMov.MOV_MOVIMIENTODETALLE.Rows(0)
                    Dim TipoDoc As String = drMovDet.IDDOCUMENTO
                    Dim NumeroDoc As Integer = drMovDet.NUMERO
                    For Each drAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPRow In dtAgrpa.Rows
                        drMovDet = dsMov.MOV_MOVIMIENTODETALLE.NewMOV_MOVIMIENTODETALLERow
                        drMovDet.IDDOCUMENTO = TipoDoc
                        drMovDet.NUMERO = NumeroDoc
                        drMovDet.NUMEROLINEA = dsMov.MOV_MOVIMIENTODETALLE.Rows(dsMov.MOV_MOVIMIENTODETALLE.Rows.Count - 1)("NUMEROLINEA") + 1
                        drMovDet.IDPRODUCTO = drAgrpa.IDPRODUCTO
                        Dim ListaP As New cDetalleListaPrecios(idLista, drAgrpa.IDPRODUCTO)
                        drMovDet.VALORBASE = ListaP.PrecioConDto
                        drMovDet.VALORIVA = ListaP.Iva
                        drMovDet.IDIVA = ListaP.iProducto.IdTipoIva
                        drMovDet.CANTIDAD = drAgrpa.CANTIDAD
                        drMovDet.VALORLINEA = (drMovDet.VALORBASE + drMovDet.VALORIVA) * drMovDet.CANTIDAD
                        drMovDet.DESCUENTO1 = 0
                        drMovDet.DESCUENTO2 = 0
                        dsMov.MOV_MOVIMIENTODETALLE.Rows.Add(drMovDet)
                        drMovDet = Nothing
                        drAgrpa.FILA = dsMov.MOV_MOVIMIENTODETALLE.Rows.Count - 1
                    Next
                Else
                    For Each drAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPRow In dtAgrpa.Rows
                        For Each drMov As dsMovimiento.MOV_MOVIMIENTODETALLERow In dsMov.MOV_MOVIMIENTODETALLE.Rows
                            If drAgrpa("IDPRODUCTO") = drMov("IDPRODUCTO") Then
                                'drMov.CANTIDAD += drAgrpa.CANTIDAD
                                drAgrpa.FILA = drMov.NUMEROLINEA - 1
                            End If
                        Next

                    Next
                End If
            End If
            Return dtAgrpa
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Private Sub ordenarDescripcionDet(ByVal drHijo As dsMovimiento.MOV_DESCRIPCIONDETRow, ByVal dsMov As dsMovimiento, ByVal numOrden As Integer)
        Dim contenido As Integer = 1
        Dim fila As Integer = 1
        Dim iProd As dsProductosTableAdapters.PRO_PRODUCTOTableAdapter
        Try
            iProd = New dsProductosTableAdapters.PRO_PRODUCTOTableAdapter
            Dim drProd As dsProductos.PRO_PRODUCTORow = iProd.GetDataByIdProducto(drHijo.IDPRODUCTO).Rows(0)
            For Each drMov As dsMovimiento.MOV_DESCRIPCIONDETRow In dsMov.MOV_DESCRIPCIONDET.Rows
                If drHijo.TIPOSUBPROD = drMov.TIPOSUBPROD And drHijo.IDPRODUCTO = drMov.IDPRODUCTO Then
                    If contenido > numOrden Then
                        contenido = 1
                        fila += 1
                    End If
                    contenido += 1
                    drMov("NUMEROPRODUCTO") = fila
                End If
            Next
        Catch ex As Exception
            Throw ex
        End Try

    End Sub

    Private Sub InsertaDescripDetalle(ByVal cDetInv As cDetalleInventarios, ByVal dsMov As dsMovimiento, ByVal FilaDetalle As Integer, ByVal numOrden As Integer)
        Try
            Dim drPadre As dsMovimiento.MOV_MOVIMIENTODETALLERow = dsMov.MOV_MOVIMIENTODETALLE.Rows(FilaDetalle)
            Dim drHijo As dsMovimiento.MOV_DESCRIPCIONDETRow = dsMov.MOV_DESCRIPCIONDET.NewRow
            drHijo.SetParentRow(drPadre, dsMov.Relations("FK_MOV_MOVIMIENTODETALLE_MOV_DESCRIPCIONDET"))
            drHijo.IDPRODUCTO = cDetInv.idProducto
            drHijo.TIPOSUBPROD = cDetInv.TipoSubProd
            drHijo.NUMEROREGISTRO = cDetInv.NumeroRegistro
            drHijo.NUMEROPRODUCTO = cDetInv.consecutivo
            drHijo.COSTO = cDetInv.costo
            dsMov.MOV_DESCRIPCIONDET.Rows.Add(drHijo)
            'ordenarDescripcionDet(drHijo, dsMov, numOrden)
            drHijo = Nothing
            drPadre = Nothing
        Catch ex As Exception
            Throw ex
        End Try
    End Sub

End Class

Public Class cBuscaDetalleInvYPrepacks
    Dim DtDetInvPrepack As dsInvenConsultas.INV_CONSULTAPREPACKDataTable
    Dim lDetalleInvEsCorrecto As Boolean = False
    Dim lTipoBusqueda As Byte
    Dim lCantidadDetalle As Integer = 0
    Dim LDescDetAtomatico As Boolean
    Private lTipoDoc As cTipoDocumento

    Public Sub New(ByVal TipoBusqueda As Byte, ByVal Bodega As String, ByVal IdProducto As String, ByVal Estado As String, ByVal nReg As Int16, ByVal TipoDoc As cTipoDocumento, ByVal DescDetAutomatico As Boolean)
        lTipoDoc = TipoDoc
        LDescDetAtomatico = DescDetAutomatico
        lTipoBusqueda = TipoBusqueda
        Dim qFrom As String
        Dim qSelect As String = "SELECT * "
        Dim qWhere As String = "WHERE "
        Dim CuentaW As Byte = 0
        Dim qOrder As String = "ORDER BY PAREJA, CONSECPREPACK "
        Try
            Dim iProd As cProducto = New cProducto(IdProducto)
            If iProd.EsPadre = "S" And lTipoBusqueda > 0 Then
                Dim iTipoPPack As New TipoPrepack(lTipoBusqueda)
                If iProd.CantidadSubProd <> iTipoPPack.CantidadIMEI Then
                    Throw New Exception("Producto no es compatible con este tipo de prepack, favor verifique e intente de nuevo")
                End If
            End If
            'If iProd.ICCIDEnCompras = "S" And iProd.EsPadre = "S" Then
            '    TipoBusqueda = 2
            'ElseIf iProd.EsPadre = "N" And TipoBusqueda = 2 Then
            '    TipoBusqueda = 1
            'End If
            nReg *= iProd.CantidadSubProd
            Using CONN As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
                Using CMD As OracleCommand = CONN.CreateCommand
                    If Bodega.Trim.Length > 0 Then
                        qWhere &= "IDBODEGA=:PBODEGA"
                        CMD.Parameters.Add("PBODEGA", OracleDbType.Varchar2).Value = Bodega
                        CuentaW += 1
                    End If
                    If IdProducto.Trim.Length > 0 Then
                        If CuentaW > 0 Then _
                            qWhere &= " AND "
                        CuentaW += 1
                        qWhere &= "IDPRODUCTO = :PIDPRODUCTO"
                        CMD.Parameters.Add("PIDPRODUCTO", OracleDbType.Varchar2).Value = IdProducto
                    End If
                    If iProd.TipoSubProd = 1 Or iProd.TipoSubProd = 2 Then
                        If CuentaW > 0 Then _
                            qWhere &= " AND "
                        CuentaW += 1
                        qWhere &= "TIPOSUBPROP = :PTIPOSUBPROD"
                        CMD.Parameters.Add("PTIPOSUBPROD", OracleDbType.Int16).Value = iProd.TipoSubProd
                    End If
                    If TipoBusqueda = 0 Then
                        If iProd.EsPadre = "S" Then
                            qFrom = "FROM (SELECT * FROM INV_NOPREPACKPADRE ORDER BY FECHAPREPACK,PAREJA DESC) "
                            qOrder = ""
                        Else
                            qFrom = "FROM (SELECT * FROM INV_NOPREPACKHIJO ORDER BY FECHAPREPACK,PAREJA DESC) "
                            qOrder = ""
                        End If
                    Else
                        qFrom = "FROM (SELECT * FROM INV_VPREPACKS WHERE IDTIPOPREPACK = " & TipoBusqueda & " ORDER BY FECHAPREPACK,PAREJA DESC)"
                    End If
                    If nReg >= 0 Then
                        If CuentaW > 0 Then _
                            qWhere &= " AND "
                        CuentaW += 1
                        qWhere &= "ROWNUM <= :PNREG"
                        CMD.Parameters.Add("PNREG", OracleDbType.Int16).Value = nReg
                    End If
                    If Estado.Trim.Length > 0 And TipoBusqueda = 2 Then
                        If CuentaW > 0 Then _
                            qWhere &= " AND "
                        CuentaW += 1
                        qWhere &= "ESTADO = :PESTADO"
                        CMD.Parameters.Add("PESTADO", OracleDbType.Varchar2).Value = Estado
                    End If
                    If CuentaW = 0 Then _
                        qWhere = ""
                    'If TipoBusqueda Then
                    CMD.CommandText = qSelect + " " + qFrom + " " + qWhere + " " + qOrder
                    CONN.Open()
                    DtDetInvPrepack = New dsInvenConsultas.INV_CONSULTAPREPACKDataTable
                    DtDetInvPrepack.Load(CMD.ExecuteReader)
                    lCantidadDetalle = DtDetInvPrepack.Rows.Count / iProd.CantidadSubProd
                    CONN.Close()
                    If TipoBusqueda <> 0 AndAlso Not DatosCorrectos(iProd.CantidadSubProd) Then
                        lDetalleInvEsCorrecto = False
                        Throw New Exception("Datos cargados no son correctos, puede ser que el inventario no se haya ingresado correctamente, o que la cantidad de IMEI o ICCID no sea la correcta")
                    Else
                        lDetalleInvEsCorrecto = True
                    End If
                End Using
            End Using
        Catch ex As Exception
            Throw ex
        End Try
    End Sub


    Private Function DatosCorrectos(ByVal Saltos As Int16) As Boolean
        Dim EsCorrecto As Boolean = True
        Dim Salir As Boolean = False
        For i As Integer = 0 To DtDetInvPrepack.Rows.Count - 1 Step Saltos
            Dim dr1 As dsInvenConsultas.INV_CONSULTAPREPACKRow = DtDetInvPrepack.Rows(i)
            Dim Consec As Integer = dr1.CONSECPREPACK
            Dim Pare As String = dr1.PAREJA
            For j As Integer = i To Saltos + i - 1
                Dim dr2 As dsInvenConsultas.INV_CONSULTAPREPACKRow = DtDetInvPrepack.Rows(j)
                If dr2.CONSECPREPACK <> Consec Or dr2.PAREJA <> Pare Then
                    EsCorrecto = False
                    Salir = True
                    Exit For
                End If
            Next
            If Salir Then _
                Exit For
        Next
        Return EsCorrecto
    End Function
    Public ReadOnly Property DatosDetInvePreapack() As dsInvenConsultas.INV_CONSULTAPREPACKDataTable
        Get
            Return DtDetInvPrepack
        End Get
    End Property
    Public ReadOnly Property CantidadDetalle() As Integer
        Get
            Return lCantidadDetalle
        End Get
    End Property
    Private Sub InsertaDescripDetalle(ByVal cDetInv As cDetalleInventarios, ByVal dsMov As dsMovimiento, ByVal FilaDetalle As Integer)
        Try
            If LDescDetAtomatico Then
                Dim drPadre As dsMovimiento.MOV_MOVIMIENTODETALLERow = dsMov.MOV_MOVIMIENTODETALLE.Rows(FilaDetalle)
                Dim drHijo As dsMovimiento.MOV_DESCRIPCIONDETRow = dsMov.MOV_DESCRIPCIONDET.NewRow
                drHijo.SetParentRow(drPadre, dsMov.Relations("FK_MOV_MOVIMIENTODETALLE_MOV_DESCRIPCIONDET"))
                drHijo.IDPRODUCTO = cDetInv.idProducto
                drHijo.TIPOSUBPROD = cDetInv.TipoSubProd
                drHijo.NUMEROREGISTRO = cDetInv.NumeroRegistro
                drHijo.NUMEROPRODUCTO = cDetInv.consecutivo
                drHijo.COSTO = cDetInv.costo
                dsMov.MOV_DESCRIPCIONDET.Rows.Add(drHijo)
                drHijo = Nothing
                drPadre = Nothing
            End If
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
    Private Function GetFilaDetalle(ByVal dsMov As dsMovimiento, ByVal IdProducto As String) As Int16
        Dim nReg As Int16 = -1
        For i As Int16 = 0 To dsMov.MOV_MOVIMIENTODETALLE.Rows.Count - 1
            If dsMov.MOV_MOVIMIENTODETALLE.Rows(i)("IDPRODUCTO").ToString.Trim.ToUpper = IdProducto.Trim.ToUpper Then
                nReg = i
                Exit For
            End If
        Next
        Return nReg
    End Function

    Private Function verificaCantMovDetalle(ByVal dsMovi As dsMovimiento, ByVal dtAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPDataTable, ByVal numeroLineaPadre As Integer, ByVal cant As Integer) As Boolean
        Try
            Dim cantidadHijos As Integer = 0
            Dim cantidadPadre As Integer = 0
            If dtAgrpa.Rows.Count > 0 Then
                Dim drAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPRow = dtAgrpa.Rows(0)
                For Each dr As dsMovimiento.MOV_MOVIMIENTODETALLERow In dsMovi.MOV_MOVIMIENTODETALLE.Rows
                    If dr.NUMEROLINEAPADRE <> 0 Then
                        If dr.IDPRODUCTO = drAgrpa.IDPRODUCTO And dr.NUMEROLINEAPADRE = numeroLineaPadre Then
                            cantidadHijos += dr.CANTIDAD
                        End If
                    Else
                        If dr.NUMEROLINEA = numeroLineaPadre Then
                            cantidadPadre = dr.CANTIDAD
                        End If
                    End If
                Next

                If cantidadHijos = 0 Or (cantidadHijos < cantidadPadre) Then

                    Return True
                Else
                    If cantidadHijos > cantidadPadre Then
                        Dim diferencia As Integer = cantidadHijos - cantidadPadre
                        For Each dr As dsMovimiento.MOV_MOVIMIENTODETALLERow In dsMovi.MOV_MOVIMIENTODETALLE.Rows
                            If dr.IDPRODUCTO = drAgrpa.IDPRODUCTO And dr.NUMEROLINEAPADRE = numeroLineaPadre Then
                                cantidadHijos += dr.CANTIDAD
                            End If
                            If dr.NUMEROLINEA = numeroLineaPadre Then
                                cantidadPadre = dr.CANTIDAD
                            End If
                        Next
                    End If
                    Return False
                End If
            Else
                Return False
            End If
        Catch ex As Exception

        End Try
    End Function




    Private Function InsertaMovDetalle(ByVal dsMov As dsMovimiento, ByVal dtAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPDataTable, ByVal idLista As String, ByVal numeroLineaPadre As Integer, ByVal cant As Integer) As dsInvenConsultas.INV_AGRUPACODIGOSTMPDataTable
        Try

            If dsMov.MOV_MOVIMIENTODETALLE.Rows.Count > 0 And verificaCantMovDetalle(dsMov, dtAgrpa, numeroLineaPadre, cant) Then
                Dim drMovDet As dsMovimiento.MOV_MOVIMIENTODETALLERow
                drMovDet = dsMov.MOV_MOVIMIENTODETALLE.Rows(0)
                Dim TipoDoc As String = drMovDet.IDDOCUMENTO
                Dim NumeroDoc As Integer = drMovDet.NUMERO
                For Each drAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPRow In dtAgrpa.Rows
                    drMovDet = dsMov.MOV_MOVIMIENTODETALLE.NewMOV_MOVIMIENTODETALLERow
                    drMovDet.IDDOCUMENTO = TipoDoc
                    drMovDet.NUMERO = NumeroDoc
                    drMovDet.NUMEROLINEA = dsMov.MOV_MOVIMIENTODETALLE.Rows(dsMov.MOV_MOVIMIENTODETALLE.Rows.Count - 1)("NUMEROLINEA") + 1
                    Dim ListaP As New cDetalleListaPrecios(idLista, drAgrpa.IDPRODUCTO)
                    If lTipoDoc.DocEs = eTipoMovimi.TrasladoCodigo Then
                        If ListaP.iProducto.IdProdConvierte Is DBNull.Value Or cGeneral.NToCad(ListaP.iProducto.IdProdConvierte).Trim.Length = 0 Then
                            Throw New Exception("Codigo producto prepack no tiene id de producto a convertir ")
                        Else
                            drMovDet.IDPRODDESTINO = ListaP.iProducto.IdProdConvierte
                        End If
                    End If
                    drMovDet.IDPRODUCTO = drAgrpa.IDPRODUCTO
                    drMovDet.VALORBASE = ListaP.PrecioConDto
                    drMovDet.VALORIVA = ListaP.Iva
                    drMovDet.IDIVA = ListaP.iProducto.IdTipoIva
                    drMovDet.CANTIDAD = drAgrpa.CANTIDAD
                    drMovDet.VALORLINEA = (drMovDet.VALORBASE + drMovDet.VALORIVA) * drMovDet.CANTIDAD
                    drMovDet.DESCUENTO1 = 0
                    drMovDet.DESCUENTO2 = 0
                    drMovDet.NUMEROLINEAPADRE = numeroLineaPadre
                    dsMov.MOV_MOVIMIENTODETALLE.Rows.Add(drMovDet)
                    drMovDet = Nothing
                    drAgrpa.FILA = dsMov.MOV_MOVIMIENTODETALLE.Rows.Count - 1
                Next
            Else
                If dtAgrpa.Rows.Count > 0 Then
                    Dim drAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPRow = dtAgrpa.Rows(0)
                    drAgrpa.FILA = -1
                Else
                    Dim drAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPRow = dtAgrpa.NewINV_AGRUPACODIGOSTMPRow
                    drAgrpa.IDPRODUCTO = "NO"
                    drAgrpa.CANTIDAD = 0
                    drAgrpa.FILA = -1
                    dtAgrpa.AddINV_AGRUPACODIGOSTMPRow(drAgrpa)
                End If
            End If
            Return dtAgrpa
        Catch ex As Exception
            Throw ex
        End Try
    End Function
    Private Function AgrupaByCodigo() As dsInvenConsultas.INV_AGRUPACODIGOSTMPDataTable
        Dim DtAgrupa As New dsInvenConsultas.INV_AGRUPACODIGOSTMPDataTable
        For Each drConsDet As dsInvenConsultas.INV_CONSULTAPREPACKRow In DtDetInvPrepack.Rows
            If drConsDet("IDPRODUCTOH") IsNot DBNull.Value Then
                Dim drAgrupa As dsInvenConsultas.INV_AGRUPACODIGOSTMPRow = DtAgrupa.Rows.Find(New Object() {drConsDet.IDPRODUCTOH})
                If drAgrupa IsNot Nothing Then
                    drAgrupa.CANTIDAD += 1
                Else
                    drAgrupa = DtAgrupa.NewINV_AGRUPACODIGOSTMPRow
                    drAgrupa.IDPRODUCTO = drConsDet.IDPRODUCTOH
                    drAgrupa.CANTIDAD += 1
                    DtAgrupa.Rows.Add(drAgrupa)
                End If
                drAgrupa = Nothing
            End If
        Next
        Return DtAgrupa
    End Function
    Public Sub InsertaDatos(ByVal dsMov As dsMovimiento, ByVal FilaDetalle As Integer, ByVal ListaP As String, ByVal cant As Integer)
        If lTipoBusqueda = 0 Then
            For Each drConsDet As dsInvenConsultas.INV_CONSULTAPREPACKRow In DtDetInvPrepack.Rows
                InsertaDescripDetalle(New cDetalleInventarios(drConsDet.IDPRODUCTO, drConsDet.IDBODEGA, drConsDet.TIPOSUBPROP, drConsDet.NUMEROREGISTROP), dsMov, FilaDetalle)
            Next
        Else
            For Each drConsDet As dsInvenConsultas.INV_CONSULTAPREPACKRow In DtDetInvPrepack.Rows
                InsertaDescripDetalle(New cDetalleInventarios(drConsDet.IDPRODUCTOP, drConsDet.IDBODEGA, drConsDet.TIPOSUBPROP, drConsDet.NUMEROREGISTROP), dsMov, FilaDetalle)
            Next
            Dim dtAgrupa As dsInvenConsultas.INV_AGRUPACODIGOSTMPDataTable = InsertaMovDetalle(dsMov, AgrupaByCodigo(), ListaP, FilaDetalle + 1, cant)
            For Each drConsDet As dsInvenConsultas.INV_CONSULTAPREPACKRow In DtDetInvPrepack.Rows
                If drConsDet("IDPRODUCTOH") IsNot DBNull.Value Then
                    Dim drAgrpa As dsInvenConsultas.INV_AGRUPACODIGOSTMPRow = dtAgrupa.Rows.Find(New Object() {drConsDet.IDPRODUCTOH})
                    If drAgrpa.FILA <> -1 Then
                        InsertaDescripDetalle(New cDetalleInventarios(drConsDet.IDPRODUCTOH, drConsDet.IDBODEGA, drConsDet.TIPOSUBPRODH, drConsDet.NUMEROREGISTROH), dsMov, drAgrpa.FILA)
                    End If
                End If
            Next
        End If
    End Sub
End Class

Public Class cCierrePeriodo
    Dim Per As cPeriodos
    Private lPeriodoAct As String
    Private lNewPeriodo As String
    Private Sub CierraPeriodo()
        Using Conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = Conn.CreateCommand
                cmd.CommandText = "INV_CIERREPERIODO"
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.Add("PERIODOACT", OracleDbType.Varchar2).Value = lPeriodoAct
                cmd.Parameters.Add("PERIODONEW", OracleDbType.Varchar2).Value = lNewPeriodo
                Try
                    Conn.Open()
                    cmd.ExecuteNonQuery()
                    Conn.Close()
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    Public Sub New(ByVal Periodo As String)
        lPeriodoAct = Periodo
        Try
            Per = New cPeriodos(lPeriodoAct)
            Per.NextPeriodo()
            lNewPeriodo = Per.IDPERIODO
            CierraPeriodo()
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
    Public ReadOnly Property PeriodoAct() As String
        Get
            Return lPeriodoAct
        End Get
    End Property
    Public ReadOnly Property NewPeriodo() As String
        Get
            Return lNewPeriodo
        End Get
    End Property
End Class
Public Class cReconstruyeInventarios
    Private lDsMov As dsMovimiento
    Public Event Estado(ByVal txtEstado As String)
    Private lNregProc As Integer = 0
    Private lPeriodo As String
    Private Sub IniciaPeriodo()
        Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = conn.CreateCommand
                cmd.CommandText = "INV_INICIAPERIODO"
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.Add("PPERIODO", OracleDbType.Varchar2).Value = lPeriodo
                Try
                    conn.Open()
                    cmd.ExecuteNonQuery()
                    conn.Close()
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub
    Private Sub CambiaEstado(ByVal dt As DataTable)
        For Each dr As DataRow In dt.Rows
            dr.SetAdded()
        Next
    End Sub
    Private Sub CargaByTipoNumero(ByVal TipoDoc As String, ByVal Numero As Integer)
        Try
            Dim daMov As New dsMovimientoTableAdapters.MOV_MOVIMIENTOTableAdapter
            daMov.FillByIdDocumentoNumero(lDsMov.MOV_MOVIMIENTO, TipoDoc, Numero)
            CambiaEstado(lDsMov.MOV_MOVIMIENTO)
            Dim daDetMov As New dsMovimientoTableAdapters.MOV_MOVIMIENTODETALLETableAdapter
            daDetMov.FillByIdDocumentoNumero(lDsMov.MOV_MOVIMIENTODETALLE, TipoDoc, Numero)
            CambiaEstado(lDsMov.MOV_MOVIMIENTODETALLE)
            Dim daDescdet As New dsMovimientoTableAdapters.MOV_DESCRIPCIONDETTableAdapter
            daDescdet.FillByIdDocumentoNumero(lDsMov.MOV_DESCRIPCIONDET, TipoDoc, Numero)
            CambiaEstado(lDsMov.MOV_DESCRIPCIONDET)
            Dim daMovNC As New dsMovimientoTableAdapters.MOV_DETALLENOTASCREDITOTableAdapter
            daMovNC.FillByIdDocumento(lDsMov.MOV_DETALLENOTASCREDITO, TipoDoc, Numero)
            CambiaEstado(lDsMov.MOV_DETALLENOTASCREDITO)
            Dim daMovND As New dsMovimientoTableAdapters.MOV_DETALLENOTASDEBITOTableAdapter
            daMovND.FillByIdDocNumero(lDsMov.MOV_DETALLENOTASDEBITO, TipoDoc, Numero)
            CambiaEstado(lDsMov.MOV_DETALLENOTASDEBITO)
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
    Private Sub EliminaDescDetalle(ByVal TipoDoc As String)
        Try
            Dim Tdoc As cTipoDocumento = New cTipoDocumento(TipoDoc)
            If Tdoc.DocEs = eTipoMovimi.Compra Or Tdoc.DocEs = eTipoMovimi.Entrada Or Tdoc.DocEs = eTipoMovimi.NDCompras Then
                Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
                    Using cmd As OracleCommand = conn.CreateCommand
                        cmd.CommandText = "DELETE FROM INV_DETALLE WHERE TIPOSUBPROD=:PTIPOSUBPROD AND NUMEROREGISTRO=:PNUMEROREGISTRO "
                        cmd.Parameters.Add("PTIPOSUBPROD", OracleDbType.Int16)
                        cmd.Parameters.Add("PNUMEROREGISTRO", OracleDbType.Varchar2)
                        conn.Open()
                        For Each drDesDet As dsMovimiento.MOV_DESCRIPCIONDETRow In lDsMov.MOV_DESCRIPCIONDET.Rows
                            cmd.Parameters("PTIPOSUBPROD").Value = drDesDet.TIPOSUBPROD
                            cmd.Parameters("PNUMEROREGISTRO").Value = drDesDet.NUMEROREGISTRO
                            cmd.ExecuteNonQuery()
                        Next
                        conn.Close()
                    End Using
                End Using
            End If
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
    Public Sub Reconstruye()
        Try
            RaiseEvent Estado("Iniciando datos del periodo : " & lPeriodo)
            lNregProc = 0
            IniciaPeriodo()
            Dim Per As cPeriodos = New cPeriodos(lPeriodo)
            Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
                Using cmd As OracleCommand = conn.CreateCommand
                    cmd.CommandText = "SELECT IDDOCUMENTO, NUMERO, IDTERCERO, SUCURSAL FROM MOV_MOVIMIENTO, GLO_TIPODOCUMENTO WHERE MOV_MOVIMIENTO.IDDOCUMENTO=GLO_TIPODOCUMENTO.TIPODOC AND FECHADOCUMENTO BETWEEN :DESDEF AND :HASTAF ORDER BY MOV_MOVIMIENTO.FECHADOCUMENTO, GLO_TIPODOCUMENTO.ORDENCOSTEO"
                    cmd.Parameters.Add("DESDEF", OracleDbType.Date).Value = Per.DESDEF
                    cmd.Parameters.Add("HASTAF", OracleDbType.Date).Value = Per.HASTAF
                    conn.Open()
                    RaiseEvent Estado("Cargando Movimiento del periodo :" & lPeriodo & " ...")
                    Dim drMov As OracleDataReader = cmd.ExecuteReader
                    While drMov.Read()
                        lDsMov = New dsMovimiento
                        CargaByTipoNumero(drMov("IDDOCUMENTO"), drMov("NUMERO"))
                        EliminaDescDetalle(drMov("IDDOCUMENTO"))
                        Dim tDoc As cTipoDocumento = New cTipoDocumento(drMov("IDDOCUMENTO"))
                        Dim AfeInv As cAfectaIventarios
                        If tDoc.DocEs = eTipoMovimi.Venta Or tDoc.DocEs = eTipoMovimi.NCVentas Then
                            Dim iCliente As New cClientes(drMov("IDTERCERO"))
                            AfeInv = New cAfectaIventarios(lDsMov, tDoc, Per, True, iCliente, "N")
                        Else
                            AfeInv = New cAfectaIventarios(lDsMov, tDoc, Per, True, "N")
                        End If
                        AfeInv.AfectaInventarios()
                        AfeInv = Nothing
                        lNregProc += 1
                        If lNregProc Mod 10 = 0 Then _
                            RaiseEvent Estado(lNregProc.ToString & " Registros procesados...")
                    End While
                    drMov.Close()
                    conn.Close()
                    RaiseEvent Estado("Total Registros Procesados...." & lNregProc.ToString)
                End Using
            End Using
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
    Public Sub New(ByVal Periodo As String)
        Try
            lPeriodo = Periodo
        Catch ex As Exception
            Throw ex
        End Try
    End Sub

    Public ReadOnly Property RegistrosProcesados() As Integer
        Get
            Return lNregProc
        End Get
    End Property
End Class

Public Class cMuevePrepack
    Private lDsMov As dsMovimiento
    Private iDoc As cTipoDocumento
    Private Function GetChildRows(ByVal drDet As dsMovimiento.MOV_MOVIMIENTODETALLERow) As DataRow()
        Return lDsMov.MOV_DESCRIPCIONDET.Select("IDDOCUMENTO='" & drDet.IDDOCUMENTO & "' AND NUMERO=" & drDet.NUMERO & " AND NUMEROLINEA=" & drDet.NUMEROLINEA, "NUMEROLINEA", DataViewRowState.Added Or DataViewRowState.Deleted Or DataViewRowState.ModifiedCurrent Or DataViewRowState.ModifiedOriginal)
        'Select Case drDet.RowState
        '    Case DataRowState.Deleted
        '        Return drDet.GetChildRows("FK_MOV_MOVIMIENTODETALLE_MOV_DESCRIPCIONDET", DataRowVersion.Original)
        '    Case Else
        '        Return drDet.GetChildRows("FK_MOV_MOVIMIENTODETALLE_MOV_DESCRIPCIONDET", DataRowVersion.Current)
        'End Select
    End Function
    Private Sub ActualizaPPack(ByVal IDPROD As String, ByVal NUMREG As String, ByVal PRODES As String)
        Using Conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = Conn.CreateCommand
                cmd.CommandText = "INV_ACTUALIZAPPACKTRASALADO"
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.Add("PIDPRODUCTOP", OracleDbType.Varchar2).Value = IDPROD
                cmd.Parameters.Add("PNUMEROREGISTROP", OracleDbType.Varchar2).Value = NUMREG
                cmd.Parameters.Add("PPRODES", OracleDbType.Varchar2).Value = PRODES
                Try
                    Conn.Open()
                    cmd.ExecuteNonQuery()
                    Conn.Close()
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub
    Private Function GetCampoDetalle(ByVal drDet As dsMovimiento.MOV_MOVIMIENTODETALLERow, ByVal Campo As String) As String
        If drDet.RowState = DataRowState.Deleted Then
            Return drDet(Campo, DataRowVersion.Original)
        Else
            Return drDet(Campo, DataRowVersion.Current)
        End If
    End Function
    Private Function GetCampoDescDet(ByVal drDesDet As dsMovimiento.MOV_DESCRIPCIONDETRow, ByVal Campo As String) As String
        If drDesDet.RowState = DataRowState.Deleted Then
            Return drDesDet(Campo, DataRowVersion.Original)
        Else
            Return drDesDet(Campo, DataRowVersion.Current)
        End If
    End Function
    Public Sub New(ByVal dsMov As dsMovimiento)
        Try
            lDsMov = dsMov
            For Each drEncMov As dsMovimiento.MOV_MOVIMIENTORow In lDsMov.MOV_MOVIMIENTO.Rows
                If drEncMov.RowState = DataRowState.Deleted Then
                    iDoc = New cTipoDocumento(drEncMov("IDDOCUMENTO", DataRowVersion.Original))
                Else
                    iDoc = New cTipoDocumento(drEncMov.IDDOCUMENTO)
                End If

                If iDoc.DocEs = eTipoMovimi.TrasladoCodigo Then
                    For Each drDet As dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsMov.MOV_MOVIMIENTODETALLE.Rows
                        For Each drDesDet As dsMovimiento.MOV_DESCRIPCIONDETRow In GetChildRows(drDet)
                            If drDet.RowState = DataRowState.Deleted Or drDesDet.RowState = DataRowState.Deleted Then
                                Dim iProd As cProducto = New cProducto(GetCampoDetalle(drDet, "IDPRODUCTO"))
                                If iProd.EsPadre.ToUpper = "S" Then
                                    ActualizaPPack(GetCampoDetalle(drDet, "IDPRODUCTO"), GetCampoDescDet(drDesDet, "NUMEROREGISTRO"), "P")
                                Else
                                    ActualizaPPack(GetCampoDetalle(drDet, "IDPRODUCTO"), GetCampoDescDet(drDesDet, "NUMEROREGISTRO"), "H")
                                End If
                            Else
                                Dim iProd As cProducto = New cProducto(GetCampoDetalle(drDet, "IDPRODDESTINO"))
                                If iProd.EsPadre.ToUpper = "S" Then
                                    ActualizaPPack(GetCampoDetalle(drDet, "IDPRODDESTINO"), GetCampoDescDet(drDesDet, "NUMEROREGISTRO"), "P")
                                Else
                                    ActualizaPPack(GetCampoDetalle(drDet, "IDPRODDESTINO"), GetCampoDescDet(drDesDet, "NUMEROREGISTRO"), "H")
                                End If
                            End If
                        Next
                    Next
                End If
            Next
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
End Class

Public Class GeneraPlanoConvierteCodigo
    Private lDatos As dsConsultaInv.INV_AGRPACAMBIOCODIGODataTable
    Dim tDoc As cTipoDocumento
    Private lArcGen As Integer = 0
    Private Function GetFPUltimaCompra(ByVal IDPRODUCTO As String) As String
        Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = conn.CreateCommand
                cmd.CommandText = "SELECT MAX(FECHADOCUMENTO),IDFORMAPAGO,NDIAS FROM INV_CONSULTAMOVIMIENTO WHERE DOCES=5 AND IDPRODUCTO=:PIDPROD GROUP BY IDFORMAPAGO,NDIAS "
                cmd.Parameters.Add("IDPROD", OracleDbType.Varchar2).Value = IDPRODUCTO
                Try
                    Dim Dt As New DataTable
                    conn.Open()
                    Dt.Load(cmd.ExecuteReader)
                    conn.Close()
                    Dim Dias As Int16 = 0
                    If Dt.Rows.Count > 0 Then
                        Dim DR As DataRow = Dt.Rows(0)
                        Dias = DR("NDIAS")
                    End If
                    Return Dias
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Function
    Private Sub SetFormaPago()
        Dim IDPROD As String = ""
        Dim NDias As Int16 = 0
        For Each dr As dsConsultaInv.INV_AGRPACAMBIOCODIGORow In lDatos.Rows
            If dr("IDPRODUCTOORI") <> IDPROD Then
                NDias = GetFPUltimaCompra(dr("IDPRODUCTOORI"))
                IDPROD = dr("IDPRODUCTOORI")
            End If
            dr.IDFORMAPAGO = NDias
        Next
    End Sub
    Private Function ListaNReg(ByVal TipoSubProd As Int16) As String
        Dim TemLista As String = ""
        For Each dr As dsConsultaInv.INV_AGRPACAMBIOCODIGORow In lDatos.Rows
            If dr.TIPOSUBPROD = TipoSubProd Then
                TemLista &= "'" & dr.NUMEROREGISTRO & "',"
            End If
        Next
        If TemLista.Trim.Length > 0 Then
            Return TemLista.Substring(0, TemLista.Length - 1)
        Else
            Return TemLista
        End If
    End Function
    Private Function GetCentroSumi(ByVal ListaNumeroReg As String, ByVal TipoSubProd As Int16) As DataTable
        Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = conn.CreateCommand
                cmd.CommandText = "SELECT TIPOSUBPROD, NUMEROREGISTRO, IDCENTROSUMI  FROM INV_CONSULTAMOVDETADESCDET WHERE TIPOSUBPROD=:PTIPOSUBPROD AND NUMEROREGISTRO IN(" & ListaNumeroReg & ") AND NOT IDCENTROSUMI IS NULL ORDER BY IDPRODUCTO "
                cmd.Parameters.Add("PTIPOSUBPROD", OracleDbType.Varchar2).Value = TipoSubProd
                Try
                    conn.Open()
                    Dim Dt As New DataTable
                    Dt.Load(cmd.ExecuteReader)
                    conn.Close()
                    Return Dt
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Function
    Public Sub MezclaCentroSumi(ByVal dtCSumi As DataTable)
        For Each drCSumi As DataRow In dtCSumi.Rows
            Dim drDat As dsConsultaInv.INV_AGRPACAMBIOCODIGORow = lDatos.Rows.Find(New Object() {drCSumi("TIPOSUBPROD"), drCSumi("NUMEROREGISTRO")})
            If drDat IsNot Nothing Then
                drDat.IDCENTROSUMI = drCSumi("IDCENTROSUMI")
            End If
        Next
    End Sub
    Public Sub New(ByVal DesdeF As Date, ByVal HastaF As Date, ByVal TipoDoc As String, ByVal DatConv As dsConsultaInv.INV_AGRPACAMBIOCODIGODataTable)
        lDatos = DatConv
        Using conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
            Using cmd As OracleCommand = conn.CreateCommand
                cmd.CommandText = "SELECT IDPRODUCTO IDPRODUCTOORI, IDPRODDESTINO IDPRODUCTODEST, TIPOSUBPROD, NUMEROREGISTRO FROM INV_CONSULTAMOVDETADESCDET WHERE FECHADOCUMENTO BETWEEN :PDESDEF AND :PHASTAF AND IDDOCUMENTO=:PIDDOC ORDER BY TIPOSUBPROD,IDPRODUCTO "
                cmd.Parameters.Add("PDESDEF", OracleDbType.Date).Value = DesdeF.Date
                cmd.Parameters.Add("PHASTAF", OracleDbType.Date).Value = HastaF.Date
                cmd.Parameters.Add("PIDDOC", OracleDbType.NVarchar2).Value = TipoDoc
                Try
                    conn.Open()
                    lDatos.Rows.Clear()
                    lDatos.Load(cmd.ExecuteReader)
                    conn.Close()
                    SetFormaPago()
                    MezclaCentroSumi(GetCentroSumi(ListaNReg(1), 1))
                    MezclaCentroSumi(GetCentroSumi(ListaNReg(2), 2))
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub
    Private Function GetRompimiento() As dsConsultaInv.INV_ROMPIMIENTODataTable
        Try
            Dim dv As New DataView(lDatos)
            dv.Sort = "IDCENTROSUMI,IDFORMAPAGO"
            Dim Clave As String = ""
            Dim dt As New dsConsultaInv.INV_ROMPIMIENTODataTable
            For Each Fila As DataRowView In dv
                If Clave <> Fila("IDCENTROSUMI") & Fila("IDFORMAPAGO") Then
                    Clave = Fila("IDCENTROSUMI") & Fila("IDFORMAPAGO")
                    Dim dr As dsConsultaInv.INV_ROMPIMIENTORow = dt.NewINV_ROMPIMIENTORow
                    dr.IDCENTROSUMI = Fila("IDCENTROSUMI")
                    dr.IDFORMAPAGO = Fila("IDFORMAPAGO")
                    dt.Rows.Add(dr)
                    dr = Nothing
                End If
            Next
            Return dt
        Catch ex As Exception
            Throw ex
        End Try
    End Function
    Public ReadOnly Property HayDatos() As Boolean
        Get
            Return lDatos.Rows.Count > 0
        End Get
    End Property
    Public Sub GeneraPlano(ByVal RutaArc As String)
        Try
            lArcGen = 0
            For Each drRomp As dsConsultaInv.INV_ROMPIMIENTORow In GetRompimiento().Rows
                If File.Exists(RutaArc & "\" & drRomp.IDCENTROSUMI & drRomp.IDFORMAPAGO & ".txt") Then _
                    File.Delete(RutaArc & "\" & drRomp.IDCENTROSUMI & drRomp.IDFORMAPAGO & ".txt")
                Dim ArcPlano As StreamWriter = New StreamWriter(RutaArc & "\" & drRomp.IDCENTROSUMI & drRomp.IDFORMAPAGO & ".txt")
                For Each drAgrupa As dsConsultaInv.INV_AGRPACAMBIOCODIGORow In lDatos.Select("IDCENTROSUMI='" & drRomp.IDCENTROSUMI & "' AND IDFORMAPAGO='" & drRomp.IDFORMAPAGO & "'")
                    ArcPlano.WriteLine(drAgrupa.NUMEROREGISTRO)
                Next
                lArcGen += 1
                ArcPlano.Close()
            Next
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
    Public ReadOnly Property ArchivosGenerados() As Integer
        Get
            Return lArcGen
        End Get
    End Property
End Class
